簡體   English   中英

通過執行程序的java線程重用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM