日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程

發布時間:2023/11/27 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面介紹了線程的基本用法,按理說足夠一般的場合使用了,只是每次開辟新線程,都得單獨定義專門的線程類,著實開銷不小。注意到新線程內部真正需要開發者重寫的僅有run方法,其實就是一段代碼塊,分線程啟動之后也單單執行該代碼段而已。因而完全可以把這段代碼抽出來,把它定義為類似方法的一串任務代碼,這樣能夠像調用公共方法一樣多次調用這段代碼,也就無需另外定義新的線程類,只需命令已有的Thread去執行該代碼段就好了。

在Java中定義某個代碼段,則要借助于接口Runnable,它是個函數式接口,唯一需要實現的只有run方法。之所以定義成函數式接口的形式,是因為要給任務方法套上面向對象的殼,這樣才好由外部去調用封裝好的任務對象?,F在有個階乘運算的任務,希望開個分線程計算式子“10!”的結果,那便定義一個實現了Runnable接口的任務類FactorialTask,并重寫run方法補充求解“10!”的代碼邏輯。編寫完成的FactorialTask類代碼示例如下:

// 定義一個求階乘的任務

private static class FactorialTask implements Runnable {

@Override

public void run() {

int product = 1;

for (int i=1; i<=10; i++) {

product *= i;

}

PrintUtils.print(Thread.currentThread().getName(), "階乘結果="+product);

}

}

接著創建FactorialTask類的任務對象,并通過線程類的構造方法傳入該任務,這就實現了在分線程中啟動階乘任務的功能。下面是外部給階乘任務開啟新線程的代碼例子:

// 通過Runnable創建線程的第一種方式:傳入普通實例

FactorialTask task = new FactorialTask();

new Thread(task).start(); // 創建并啟動線程

鑒于階乘任務的實現代碼很短,似無必要定義專門的任務類,不妨循著比較器Comparator的舊例,采取匿名內部類的方式書寫更為便捷。于是可在線程類Thread的構造方法中直接填入實現后的Runnable任務代碼,具體的調用代碼如下所示:

// 通過Runnable創建線程的第二種方式:傳入匿名內部類的實例

new Thread(new Runnable() {

@Override

public void run() {

int product = 1;

for (int i=1; i<=10; i++) {

product *= i;

}

PrintUtils.print(Thread.currentThread().getName(), "階乘結果="+product);

}

}).start(); // 創建并啟動線程

由于Runnable是函數式接口,因此完全可以使用Lambda表達式加以簡化,下面便是利用Lambda表達式取代匿名內部類的任務線程代碼:

// 通過Runnable創建線程的第三種方式:使用Lambda表達式

new Thread(() -> {

int product = 1;

for (int i=1; i<=10; i++) {

product *= i;

}

PrintUtils.print(Thread.currentThread().getName(), "階乘結果="+product);

}).start(); // 創建并啟動線程

雖說Runnable接口的花樣會比直接從Thread派生的多一些,但Runnable方式依舊要求實現run方法,看起來像是換湯不換藥,感覺即使沒有Runnable也不影響線程的運用,最多在編碼上有點繁瑣罷了。可事情沒這么簡單,要知道引入線程的目的是為了加快處理速度,多個線程同時運行的話,必然涉及到資源共享及其合理分配。比如火車站賣動車票,只有一個售票窗口賣票的話,明顯賣得慢,肯定要多開幾個售票窗口,一起賣票才賣得快。假設目前還剩一百張動車票,此時開了三個售票窗口,這樣等同于啟動了三個售票線程,每個線程都在賣剩下的一百張票。倘若不采取Runnable接口,而是直接定義新線程的話,售票線程的定義代碼應該類似下面這般:

// 單獨定義一個售票線程

private static class TicketThread extends Thread {

private int ticketCount = 100; // 可出售的車票數量

public TicketThread(String name) {

setName(name); // 設置當前線程的名稱

}

@Override

public void run() {

while (ticketCount > 0) { // 還有余票可供出售

ticketCount--; // 余票數量減一

// 以下打印售票日志,包括售票時間、售票線程、當前余票等信息

String left = String.format("當前余票為%d張", ticketCount);

PrintUtils.print(Thread.currentThread().getName(), left);

}

}

}

然后分別創建并啟動三個售票線程,就像以下代碼所示的那樣:

//創建多個線程分別啟動,三個線程每個各賣100張,總共賣了300張票

new TicketThread("售票線程A").start();

new TicketThread("售票線程B").start();

new TicketThread("售票線程C").start();

猜猜看,上面三個售票線程總共賣了多少張票,實地運行測試代碼后發現,這三個線程竟然賣掉了三百張票,而不是期望的一百張余票。究其原因,乃是各線程售賣的車票為專享而非共享,每個線程只認可自己掌握的車票,不認可其它線程的車票,結果導致三個線程各賣各的,加起來一共賣了三百張票。所以單獨定義的線程類處理獨立的事務倒還湊合,要是處理共享的事務就難辦了。

如果采用Runnable接口來定義售票任務,就可以很方便地進行資源共享,只要命令三個線程同時執行售票任務即可。下面是開啟三個線程運行售票任務的代碼例子:

//只創建一個售票任務,并啟動三個線程一起執行售票任務,總共賣了100張票

Runnable seller = new Runnable() {

private int ticketCount = 100; // 可出售的車票數量

@Override

public void run() {

while (ticketCount > 0) { // 還有余票可供出售

ticketCount--; // 余票數量減一

// 以下打印售票日志,包括售票時間、售票線程、當前余票等信息

String left = String.format("當前余票為%d張", ticketCount);

PrintUtils.print(Thread.currentThread().getName(), left);

}

}

};

new Thread(seller, "售票線程A").start(); // 啟動售票線程A

new Thread(seller, "售票線程B").start(); // 啟動售票線程B

new Thread(seller, "售票線程C").start(); // 啟動售票線程C

因為100張余票位于同一個售票任務seller里面,所以這些車票理應為執行任務的線程們所共享。運行上述的任務測試代碼,觀察到如下的線程工作日志:

16:27:21.077 售票線程C 當前余票為98張

16:27:21.083 售票線程A 當前余票為96張

16:27:21.083 售票線程C 當前余票為95張

16:27:21.077 售票線程B 當前余票為97張

………………………這里省略中間的日志……………………

16:27:21.118 售票線程B 當前余票為2張

16:27:21.118 售票線程A 當前余票為1張

16:27:21.118 售票線程C 當前余票為4張

16:27:21.118 售票線程B 當前余票為0張

可見此時三個售票線程一共賣掉了100張車票,才符合多窗口同時售票的預期功能。

總結

以上是生活随笔為你收集整理的java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。