成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

java - 為什么要將Runnable接口的子類對象傳遞給Thread的構造函數?

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

問題描述

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

問題解答

回答1:

跟數據似乎關系不大,我覺得Runnable有兩個好處:

實現Runnable以后,即可以開個線程跑(一般是用executorService.exec(command),挫一點也可以用new Thread(command).start()),也可以不開線程阻塞式的跑(直接調用command.run());

Java 1.8以后可以用Lambda來跑,例如:

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

Runnable的好處是各種場景都可以用,比如你可以讓任何一個Class implements Runnable,但是extends Thread就有一些限制,因為Java單繼承的原因,在有些場景下沒法用。

回答3:

回答:

這個問題算是一個設計問題。

之所以將 Thread 和 Runnable 分開,是希望把線程的 '創建過程' 與線程的 '執行邏輯' 徹底分開。

也就是說:線程的創建過程是“代碼”;線程的執行邏輯是“數據”;

這聽起來有點叫人暈呼,不都是 JAVA 代碼么?怎么代碼又變成數據了呢?

我們不在這些概念上糾纏,我覺得可以倒轉過來思考這個問題,舉個例子來說明問題。

討論過程:

例如我要設計一個單線程程序,這個單線程需要完成兩個任務:

1、打印一句 hello world;2、計算一下 int a 與 int b 兩個數的和并輸出;

注意:到底是執行 1? 還是 2?是由參數 n 來決定的,n 是一個隨機數……

為了讓這兩個任務在同一個線程里執行,我們可以寫這樣的代碼:

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();

上面的代碼確實是可以完成任務的,但問題是我們把線程的 '創建過程' 和 '業務邏輯' 混淆在一起了……

這樣不太妙。順便說一句,從操作系統層面來看,線程的創建過程其實是非常復雜的!

Java 語言把這種復雜性都封裝得看不見了,雖然代碼上就是一個 Thread 類,調用起來似乎也沒什么門檻,但 Thread 的創建過程還是很復雜、很消耗資源的。

言歸正傳,現在我再次加入一個小小的需求,除了前面的 1、2,我再加入一個 3,顯示一下系統當前時間戳。

于是任務變成了:1、打印一句 hello world;2、計算一下 int a 與 int b 兩個數的和并輸出;3、顯示一下系統當前時間戳;

注意,這時候我們需要修改 Thread 的創建過程,也就是修改 start 函數:

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()); // 這里是新增的語句} }};t.start();

討論至此,讓我們仔細觀察觀察……其實:

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

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

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

這應該是一個不錯的主意!

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

到這里不知道你是否已經完全明白了? :D

哈哈,Java 的 Thread 類不是剛好提供了一個帶有 Runnable 參數的構造器么?

我們將業務代碼被放到 Runnable 接口的實現類里:

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()); // 這里是新增的語句} }}

那么最后,我們可以這么調用:

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

這樣就完成了線程的 '創建過程' 和 '業務邏輯' 徹底拆分!這種 '拆分' 也為 Java 線程池(Thread Pool)技術做好了鋪墊。

說實話,示例代碼中的 Thread t = new Thread() { ... } 這個還是夠簡單的,但在線程池中創建 Thread 可就沒這么簡單了。

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

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

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

如果 Runable 實現類里面,夾帶的還是一個 Runnable 列表會怎么樣呢?

總結:

1、使用 Runnable 接口的目的是把線程的 '創建過程' 與線程的 '執行邏輯' 徹底分開;2、Thread 不能共享資源,Runnable 能共享資源,這個說法是不正確的;3、在討論過程中我們是從具體到抽象;4、我在例子中給出的代碼確實比較簡單,但希望能說明白問題;

好了,以上就是我對這個問題的回答,希望對你有所幫助。

標簽: java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人小视频在线观看| 日韩欧美在线网站| 欧美一区二区三区精品| 午夜精品福利一区二区蜜股av| 一区二区三区我不卡| 制服.丝袜.亚洲.另类.中文| 久久成人精品无人区| 色综合久久久久久久久久久| 午夜精品一区在线观看| 亚洲一区激情| 亚洲一区二区综合| 亚洲视频成人| 亚洲男人天堂av网| 亚洲国产专区| 亚洲美女少妇撒尿| 日韩亚洲一区在线播放| 最好看的中文字幕久久| 伊人天天综合| 亚洲欧美视频在线观看视频| 亚洲成人在线| 亚洲欧美在线观看| 亚洲电影av| 国产精品理伦片| 国精品一区二区| 中文字幕中文字幕一区| 在线不卡视频| 一区二区三区电影在线播| 亚洲一区日本| 首页国产欧美久久| 欧美伊人久久久久久久久影院| 七七婷婷婷婷精品国产| 欧美日韩第一区日日骚| 国产精品一区久久久久| 精品欧美乱码久久久久久| 99国产精品99久久久久久| 久久嫩草精品久久久久| 国产精品videosex极品| 亚洲天天做日日做天天谢日日欢| 亚洲三级影院| 亚洲午夜国产一区99re久久| 色婷婷综合久久久中文字幕| 精品一区二区三区香蕉蜜桃| 欧美一二三区在线| 91麻豆福利精品推荐| 国产精品嫩草99a| 在线天堂一区av电影| 日韩一区精品视频| 欧美日韩精品电影| 丁香六月综合激情| 亚洲国产精华液网站w| 欧美日韩综合精品| 一区二区三区免费网站| 色婷婷久久一区二区三区麻豆| 经典三级在线一区| 精品福利一二区| 亚洲激情社区| 日本午夜一本久久久综合| 3d成人动漫网站| 91浏览器入口在线观看| 日韩毛片一二三区| 久久国产一二区| 国产精品中文字幕日韩精品| 久久久91精品国产一区二区精品| 亚洲三级网站| 久久精品国产久精国产爱| 制服丝袜日韩国产| 欧美日韩精品不卡| 亚洲丶国产丶欧美一区二区三区| 欧美撒尿777hd撒尿| 99视频在线精品| 亚洲精品乱码久久久久久黑人| 欧美午夜不卡视频| 欧美激情aⅴ一区二区三区| 一区二区三区色| 欧美精品99久久久**| 欧美片网站免费| 三级精品在线观看| 日韩精品一区国产麻豆| 亚洲激情女人| 久久er精品视频| 国产午夜精品一区二区三区视频 | 91国偷自产一区二区使用方法| 国产精品99久久久久久似苏梦涵| 国产精品久久综合| 久久亚洲精选| 91色在线porny| 婷婷中文字幕综合| 久久综合久久综合亚洲| 国产乱人伦精品一区二区| 国产福利一区在线观看| 亚洲美女在线一区| 日韩一区二区视频在线观看| 亚洲成人在线视频网站| 精品中文字幕一区二区小辣椒| 国产欧美一区二区三区网站| 色噜噜狠狠色综合中国| 欧美日韩精品免费观看| 日本不卡高清视频| 中文字幕第一区第二区| 欧美日韩日日夜夜| 亚洲高清久久| 国产福利电影一区二区三区| 一区二区三区在线视频免费观看 | 欧美在线首页| 日韩成人午夜精品| 国产偷国产偷精品高清尤物| 久久综合给合久久狠狠色| 99久久99久久精品国产片果冻| 石原莉奈一区二区三区在线观看 | 国产精品乱码一区二区三区| 粉嫩一区二区三区性色av| 亚洲一区精品在线| 欧美成人a视频| 久久精彩视频| 欧美涩涩网站| 韩国三级电影一区二区| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲高清毛片| 国产福利精品一区二区| 亚洲一区二区视频| 久久久久久电影| 欧美三级日韩在线| 国产一级一区二区| av一区二区三区在线| 日本伊人午夜精品| 亚洲女性喷水在线观看一区| 精品国内二区三区| 欧美亚一区二区| 日韩视频精品| 91年精品国产| 国产精品综合av一区二区国产馆| 亚洲在线视频网站| 国产精品午夜久久| 欧美mv日韩mv国产| 欧美日韩视频第一区| 亚洲一区国产一区| 亚洲小说区图片区| aaa国产一区| 国产剧情一区二区| 日韩成人av影视| 夜色激情一区二区| 中文字幕制服丝袜一区二区三区 | 日韩欧美中文字幕精品| 色婷婷av一区二区三区之一色屋| 亚洲二区精品| 91猫先生在线| 国产米奇在线777精品观看| 天天操天天干天天综合网| 亚洲日本丝袜连裤袜办公室| 久久精品网站免费观看| 日韩女优毛片在线| 正在播放亚洲一区| 欧美日韩一本到| 一本久久a久久免费精品不卡| 日韩天天综合| 极品尤物久久久av免费看| 欧美二区视频| 91啪在线观看| 99re66热这里只有精品3直播 | 国产精品久久久一区二区三区| 国产综合欧美在线看| 91免费看视频| 福利一区二区在线| 国产一区二区在线影院| 久久99精品国产.久久久久久 | 日韩精品一区第一页| 亚洲v精品v日韩v欧美v专区 | 亚洲欧美成人一区二区三区| 国产精品视频一二三区| 国产日韩精品一区二区浪潮av| 精品国产一二三| 欧美成人a∨高清免费观看| 日韩一区二区三| 制服丝袜亚洲网站| 欧美日韩国产另类一区| 欧美日韩亚洲国产综合| 欧美日韩午夜影院| 欧美日本免费一区二区三区| 欧美久久久久久久久中文字幕| 欧美女孩性生活视频| 这里只有精品免费| 日韩欧美一区在线观看| 精品久久久久久亚洲综合网| 久久这里只有精品视频网| 久久久久99精品国产片| 日本一区二区免费在线观看视频 | 中文字幕乱码久久午夜不卡 | 国产精品久久久久久久久快鸭| 亚洲国产高清aⅴ视频| 国产精品网站在线播放| 国产精品久久影院| 亚洲三级在线免费观看| 自拍偷在线精品自拍偷无码专区| 亚洲欧洲国产日韩| 亚洲一区二区三区自拍| 日本少妇一区二区| 国产在线不卡视频| av不卡一区二区三区| 在线观看一区欧美| 99v久久综合狠狠综合久久|