[英]java thread reusage via executor
我對以下內容感到困惑:
要在Java程序中使用線程,最簡單的方法是擴展Thread類並實現runnable接口(或簡單地實現runnable)。
啟動線程的執行。 我們必須調用Thread的方法start(),然后調用線程的方法run()。 所以線程開始了。
方法start()(除非我錯了) 必須完全調用 ,每個線程只調用一次 。 因此,線程實例不能被重用,除非某種方式運行方法本身在某個短的無限循環中運行,這有利於自定義實現線程的重用。
現在javadoc 鏈接文本說
如果可用,執行調用將重用先前構造的線程
我不明白這是如何實現的。 我在執行方法的execute方法中提供了我的自定義線程,例如
ExecutorService myCachedPool = Executors.newCachedThreadPool();
myCachedPool.execute(new Runnable(){public void run(){
//do something time consuming
}});
如何重用我刪除到執行程序框架的自定義線程?
Executor是否允許調用方法start()超過1次,而我們不能在我們的程序中? 我誤會了什么嗎?
謝謝。
它不是多次調用start(); 相反,池中的線程永遠不會完成,但只是保持活着---等待。 如果您想查看源代碼,可以下載源代碼。
線程池中的每個線程可以簡單地wait()
執行器將新的Runnable交給它,但Thread自己的run()
方法還沒有完成。 它只是等待一個新的Runnable被提供給Executor。
請注意,調用start()
不是Executor
- 它是ExecutorService
。 不,它不是兩次調用start()
。 它不會啟動您使用Thread.start()
直接提供的任務...而是啟動一個知道該線程池的工作隊列的線程。 線程基本上會等到有一些工作要做,然后拿起並執行它,然后再回到等待狀態。 因此,雖然線程執行多個任務,但Thread.start()
只被調用一次。
編輯:根據評論判斷,你對Runnable
(這是一個要執行的任務)和一個Thread
(執行任務)之間的區別感到有點困惑。
同一個線程可以執行多個任務。 對於不使用線程池的非常簡單的示例,請考慮以下事項:
public class MultiRunnable implements Runnable
{
private final List<Runnable> runnables;
public MultiRunnable(List<Runnable> runnables)
{
this.runnables = runnables;
}
public void run()
{
for (Runnable runnable : runnables)
{
runnable.run();
}
}
}
(忽略從多個線程使用List<T>
的潛在線程安全問題。)
您可以創建一大堆能夠執行不同操作的Runnable
任務,然后創建一個MultiRunnable
來依次運行它們。 將MultiRunnable
實例傳遞給Thread
構造函數,然后在啟動線程時,它將執行每個原始的可運行任務。 這有幫助嗎?
要多次“啟動”一個線程,請創建一個runnable。 例如:
//NO
private class T extends Thread { //not necessary to implement runnable
public void run(){
//...
}
}
void someMethod(){
T a = new T();
a.start();
a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}
代替,
//Yes
private class T implements Runnable {
public void run(){
//...
}
}
void someMethod(){
T a = new T();
new Thread(a).start();
new Thread(a).start(); //YES YES YES
}
也可以這樣做:
void someMethod(){
final Runnable r = new Runnable(){
public void run(){
//...
}
};
new Thread(r).start();
new Thread(r).start();
}
// r could also be a field of you class.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.