国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java - 為什么要將Runnable接口的子類對(duì)象傳遞給Thread的構(gòu)造函數(shù)?

瀏覽:158日期:2023-11-13 10:00:22

問(wèn)題描述

此外,runnable相比thread除了繼承方面,代碼和數(shù)據(jù)獨(dú)立體現(xiàn)在哪?像有些博客上寫(xiě)的thread不能共享資源,runnable能共享資源,將thread中的變量改成static不就行了吧?就像下面這篇說(shuō)的http://blog.csdn.net/uudou/ar...

問(wèn)題解答

回答1:

跟數(shù)據(jù)似乎關(guān)系不大,我覺(jué)得Runnable有兩個(gè)好處:

實(shí)現(xiàn)Runnable以后,即可以開(kāi)個(gè)線程跑(一般是用executorService.exec(command),挫一點(diǎn)也可以用new Thread(command).start()),也可以不開(kāi)線程阻塞式的跑(直接調(diào)用command.run());

Java 1.8以后可以用Lambda來(lái)跑,例如:

new Thread(() -> { // Do something}).start();回答2:

Runnable的好處是各種場(chǎng)景都可以用,比如你可以讓任何一個(gè)Class implements Runnable,但是extends Thread就有一些限制,因?yàn)镴ava單繼承的原因,在有些場(chǎng)景下沒(méi)法用。

回答3:

回答:

這個(gè)問(wèn)題算是一個(gè)設(shè)計(jì)問(wèn)題。

之所以將 Thread 和 Runnable 分開(kāi),是希望把線程的 '創(chuàng)建過(guò)程' 與線程的 '執(zhí)行邏輯' 徹底分開(kāi)。

也就是說(shuō):線程的創(chuàng)建過(guò)程是“代碼”;線程的執(zhí)行邏輯是“數(shù)據(jù)”;

這聽(tīng)起來(lái)有點(diǎn)叫人暈呼,不都是 JAVA 代碼么?怎么代碼又變成數(shù)據(jù)了呢?

我們不在這些概念上糾纏,我覺(jué)得可以倒轉(zhuǎn)過(guò)來(lái)思考這個(gè)問(wèn)題,舉個(gè)例子來(lái)說(shuō)明問(wèn)題。

討論過(guò)程:

例如我要設(shè)計(jì)一個(gè)單線程程序,這個(gè)單線程需要完成兩個(gè)任務(wù):

1、打印一句 hello world;2、計(jì)算一下 int a 與 int b 兩個(gè)數(shù)的和并輸出;

注意:到底是執(zhí)行 1? 還是 2?是由參數(shù) n 來(lái)決定的,n 是一個(gè)隨機(jī)數(shù)……

為了讓這兩個(gè)任務(wù)在同一個(gè)線程里執(zhí)行,我們可以寫(xiě)這樣的代碼:

float n = (float)Math.random();int a = 1;int b = 1;Thread t = new Thread() { @Override public void start() {if (n >= 0.5f) { System.out.println('hello world');} else { System.out.println(a + b);} }};t.start();

上面的代碼確實(shí)是可以完成任務(wù)的,但問(wèn)題是我們把線程的 '創(chuàng)建過(guò)程' 和 '業(yè)務(wù)邏輯' 混淆在一起了……

這樣不太妙。順便說(shuō)一句,從操作系統(tǒng)層面來(lái)看,線程的創(chuàng)建過(guò)程其實(shí)是非常復(fù)雜的!

Java 語(yǔ)言把這種復(fù)雜性都封裝得看不見(jiàn)了,雖然代碼上就是一個(gè) Thread 類,調(diào)用起來(lái)似乎也沒(méi)什么門檻,但 Thread 的創(chuàng)建過(guò)程還是很復(fù)雜、很消耗資源的。

言歸正傳,現(xiàn)在我再次加入一個(gè)小小的需求,除了前面的 1、2,我再加入一個(gè) 3,顯示一下系統(tǒng)當(dāng)前時(shí)間戳。

于是任務(wù)變成了:1、打印一句 hello world;2、計(jì)算一下 int a 與 int b 兩個(gè)數(shù)的和并輸出;3、顯示一下系統(tǒng)當(dāng)前時(shí)間戳;

注意,這時(shí)候我們需要修改 Thread 的創(chuàng)建過(guò)程,也就是修改 start 函數(shù):

float n = (float)Math.random();int a = 1;int b = 1;Thread t = new Thread() { @Override public void start() {if (n >= 0.33f) { System.out.println('hello world');} else if (n >= 0.66f) { System.out.println(a + b);} else { System.out.println(System.currentTimeMillis()); // 這里是新增的語(yǔ)句} }};t.start();

討論至此,讓我們仔細(xì)觀察觀察……其實(shí):

Thread t = new Thread() { @Override public void start() {// ... }}

這部分代碼是不變的,只有 start 函數(shù)里面的代碼是隨著需求變化而修改的。

那么我們可不可以把這部分變化的內(nèi)容包裝成一個(gè)接口??

這應(yīng)該是一個(gè)不錯(cuò)的主意!

Thread t = new Thread() { private Runnable runnable; // 這里定義一個(gè) Runnable 類型的成員 @Override public void start() {if (null != this.runnable) { runnable.run(); // 在這里用接口來(lái)把頻繁變化的業(yè)務(wù)邏輯從線程代碼里給拿出去,只調(diào)用 run 函數(shù)} }}

到這里不知道你是否已經(jīng)完全明白了? :D

哈哈,Java 的 Thread 類不是剛好提供了一個(gè)帶有 Runnable 參數(shù)的構(gòu)造器么?

我們將業(yè)務(wù)代碼被放到 Runnable 接口的實(shí)現(xiàn)類里:

class BizLogicRun implements Runnable { @Override public void run() {float n = (float)Math.rand();int a = 1;int b = 1;if (n >= 0.33f) { System.out.println('hello world');} else if (n >= 0.66f) { System.out.println(a + b);} else { System.out.println(System.currentTimeMillis()); // 這里是新增的語(yǔ)句} }}

那么最后,我們可以這么調(diào)用:

Thread t = new Thread(new BizLogicRun());t.start();

這樣就完成了線程的 '創(chuàng)建過(guò)程' 和 '業(yè)務(wù)邏輯' 徹底拆分!這種 '拆分' 也為 Java 線程池(Thread Pool)技術(shù)做好了鋪墊。

說(shuō)實(shí)話,示例代碼中的 Thread t = new Thread() { ... } 這個(gè)還是夠簡(jiǎn)單的,但在線程池中創(chuàng)建 Thread 可就沒(méi)這么簡(jiǎn)單了。

所以 '拆分' 是非常有必要的!

另外,我們是否可以想象:

class PoolRun implements Runnable { List<Runnable> runnableList;}

如果 Runable 實(shí)現(xiàn)類里面,夾帶的還是一個(gè) Runnable 列表會(huì)怎么樣呢?

總結(jié):

1、使用 Runnable 接口的目的是把線程的 '創(chuàng)建過(guò)程' 與線程的 '執(zhí)行邏輯' 徹底分開(kāi);2、Thread 不能共享資源,Runnable 能共享資源,這個(gè)說(shuō)法是不正確的;3、在討論過(guò)程中我們是從具體到抽象;4、我在例子中給出的代碼確實(shí)比較簡(jiǎn)單,但希望能說(shuō)明白問(wèn)題;

好了,以上就是我對(duì)這個(gè)問(wèn)題的回答,希望對(duì)你有所幫助。

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 一级黄色香蕉视频 | 欧美成人一区二区三区 | 国产成人综合久久精品亚洲 | 成年人一级片 | 国产做爰一区二区 | 九九视频免费精品视频免费 | 欧美老妇免费做爰视频 | 欧美jlzz18性欧美 | 久久久久久久久综合 | 久久亚洲综合中文字幕 | 国产aaa毛片| 日本午夜人成免费视频 | 国产成人精品视频播放 | 99热精品在线观看 | 日韩三级一区二区 | 成人久久精品一区二区三区 | 日本一区二区不卡久久入口 | 日本韩国一级毛片中文字幕 | 欧美大尺度免费一级特黄 | 美女视频大全网站免费 | 一区二区三区在线 | 韩国免又爽又刺激激情视频 | 久草久草 | 偷拍视频一区在线观看 | 午夜精| 国产欧美一区二区另类精品 | 成人免费大片黄在线观看com | 免费视频精品一区二区三区 | 很黄很色的免费视频 | 香港经典a毛片免费观看看 香港经典a毛片免费观看爽爽影院 | 精品国产一区二区三区久久 | 萌白酱福利视频在线网站 | 亚洲男人天堂av | 国产高清专区 | 一区免费在线观看 | 91大神大战丝袜美女在线观看 | 国产福利三区 | 亚洲欧美国产精品专区久久 | 亚洲精品天堂在线观看 | 亚洲天堂成人在线观看 | 久久免费毛片 |