日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

問題描述

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

問題解答

回答1:

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

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

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

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

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

回答3:

回答:

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

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

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

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

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

討論過程:

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

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

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

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

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

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

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

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

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

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

注意,這時候我們需要修改 Thread 的創(chuàng)建過程,也就是修改 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()); // 這里是新增的語句} }};t.start();

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

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

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

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

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

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

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

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

我們將業(yè)務代碼被放到 Runnable 接口的實現(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()); // 這里是新增的語句} }}

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

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

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

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

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

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

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

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

總結:

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

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

標簽: java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
aa国产精品| 日本亚洲视频| 国产欧美自拍一区| 亚洲女人av| 午夜久久福利| 欧美.日韩.国产.一区.二区| 国产日韩电影| 国产欧美日韩在线观看视频| 欧美伊人久久| 久久国产麻豆精品| 欧美日本久久| 欧美国产专区| 国产精品久久久久久久免费观看| 久久精品国产在热久久| 国产欧美日本| 久久99久久人婷婷精品综合| 国产精品久久久免费| 欧美aa在线视频| 美女视频黄久久| 国产a久久精品一区二区三区| 国产一区二区三区精品在线观看| 97精品国产| 亚洲精品成人图区| 久久九九精品| aa国产精品| 日韩高清成人在线| 欧美久久久网站| 国语精品一区| 欧美成人综合| 日韩av一区二区在线影视| 国产精品99久久免费观看| 日韩伦理在线一区| 亚洲免费高清| 国产欧美日韩综合一区在线播放| 精品国产成人| 国产综合精品| 欧美一区精品| 香蕉成人av| 蜜臀精品一区二区三区在线观看| 久久国产精品免费一区二区三区| 国产一区二区三区黄网站| 电影亚洲精品噜噜在线观看| 美日韩精品视频| 99在线|亚洲一区二区| 国产亚洲精品v| 亚洲毛片在线免费| 国产精品一线天粉嫩av| 国产一区日韩| 国产一区二区三区自拍| 丝袜亚洲另类欧美| 西西人体一区二区| 国产一区 二区| 久久精品午夜| 久久亚洲专区| 亚洲精品字幕| 国产精品一区二区三区www| 国产一区二区三区日韩精品| 久久婷婷丁香| 玖玖玖国产精品| 欧美日韩一区二区三区不卡视频 | 欧美日韩日本国产亚洲在线| 国产一区导航| 日韩av中文字幕一区二区| 日韩av字幕| 风间由美中文字幕在线看视频国产欧美| 91亚洲自偷观看高清| 亚洲精品中文字幕乱码| 亚洲欧美日韩国产一区| 人人爱人人干婷婷丁香亚洲| 国产精品玖玖玖在线资源| 亚洲深夜视频| 国产精品毛片一区二区三区| 日本aⅴ免费视频一区二区三区| 久久三级毛片| 在线综合视频| 亚洲精品自拍| 国产999精品在线观看| 欧美精品黄色| 国产日韩一区二区三免费高清| 美女久久久精品| 影音先锋久久| 国产精品对白| 亚洲电影在线一区二区三区| 日本电影久久久| 成人va天堂| 欧美三级第一页| 免费视频亚洲| 国产精品成人自拍| 99国产精品| 免费在线亚洲欧美| 欧美日韩高清| 国产剧情一区二区在线观看| 国产主播一区| 国产精品伊人| 蜜桃一区二区三区| 鲁大师精品99久久久| 麻豆精品91| www在线观看黄色| 亚洲精品高潮| 久久久夜夜夜| 久久亚洲人体| 日韩精品一二三四| 日韩一区电影| 国产亚洲精品美女久久| 亚洲婷婷在线| 鲁大师精品99久久久| 欧美午夜不卡| 精品一区二区三区免费看| 91精品视频一区二区| 蜜桃视频欧美| 色一区二区三区四区| 亚洲精品国产日韩| 黄色欧美日韩| 日韩成人综合| 欧美国产另类| 日产欧产美韩系列久久99| 91九色精品| 久久久久久自在自线| 欧美自拍一区| 伊人www22综合色| 日韩在线免费| 在线精品亚洲| 亚洲91网站| 亚洲一区二区网站| 国产一区日韩| 国产精品1区| 日韩精品乱码av一区二区| 制服诱惑一区二区| 日韩精品影视| 欧美www视频在线观看| 国产精品一页| 国产精品主播| 国产亚洲一卡2卡3卡4卡新区| 蜜桃免费网站一区二区三区| 亚洲免费成人| 99视频一区| 一区二区亚洲精品| 欧美不卡高清| 欧美特黄视频| 精品一区亚洲| 伊人久久大香线蕉av不卡| 日韩电影免费网站| 精品日韩一区| 成人免费电影网址| 91精品国产成人观看| 999国产精品| 伊人久久大香线蕉av不卡| 欧美日韩一二三四| 激情欧美亚洲| 国产精品88久久久久久| 伊人久久大香线蕉av不卡| 深夜视频一区二区| 久久久精品网| 欧美日韩一二三四| 国产91精品对白在线播放| 性欧美xxxx免费岛国不卡电影| 久久久久.com| 欧美日韩第一| 日韩精品成人在线观看| 国产亚洲高清在线观看| 国产欧美一区二区三区米奇| 国产另类在线| 九九九精品视频| 久久久久久网| 香蕉视频亚洲一级| 欧美成人日韩| 久久一二三区| 欧美久久香蕉| 久久夜夜操妹子| 91一区二区| 国产99久久| 亚洲一区二区成人| 日韩精品午夜视频| 国产美女精品视频免费播放软件| 国产精品久久久久久久免费软件 | 精品免费av| 日韩一区三区| 91久久视频| 欧美一区自拍| 日本精品黄色| 久久天堂av| 欧美日韩黑人| 日韩在线观看一区二区| 国产亚洲欧美日韩精品一区二区三区 | 日本亚洲视频| 国产精品腿扒开做爽爽爽挤奶网站| 成人午夜精品| 亚洲激情社区| 日本不卡中文字幕| 国产精品久久久亚洲一区| 99热国内精品| 少妇精品久久久| 麻豆91精品视频| 欧美日韩国产传媒| 日本视频一区二区| 久久久久久自在自线| 99热精品在线观看| 国产精品天堂蜜av在线播放| av高清不卡| 国产精品magnet|