我正在嘗試使用線程池來執行一些代碼,但是我在運行時遇到了一些麻煩而沒有發生錯誤。Java線程池時序問題
這是我目前的結構:
while (!(queue.IsEmpty()))
{
currentItem= queue.GetNextItem();
for (int i = 0; i < currentItem.destinations.GetNoOfItems(); i++) //for each neighbor of currentItem
{
threadPool.submit(new NeighbourThread(currentItem, allVertices, routetype, pqOpen, i, endLocation));
}
//threadPool.shutdown();
}
NeighbourThread類:
public class NeighbourThread implements Runnable {
Vertex tempVertex, endLocation;
VertexHashMap allVertices;
int routetype, i;
PriorityQueue pqOpen;
public NeighbourThread(Vertex tempVertex, VertexHashMap allVertices, int routetype, PriorityQueue pqOpen, int i, Vertex endLocation)
{
...variables
}
@Override
public void run() {
...execution code
}
}
我的想法是,它會創建所需線程基於currentItem.destinations.GetNoOfItems()
量(因爲它重用線程,我如果它達到線程創建的限制,它將等待線程完成執行並重新使用它)。
一旦線程被分配,它將提交每個可運行的線程並啓動它。
但是,我需要我的程序等待所有線程完成執行,然後再循環回到while循環。
閱讀.shutdown()的文件後,我認爲停止任何未來的線程池,這是我猜的用途,爲什麼我得到這個錯誤:
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Shutting down, pool size = 3, active threads = 1, queued tasks = 0, completed tasks = 3]
我試圖改善執行時間在我的程序上,因爲我目前正在執行超過150萬次run()方法的調用,我感覺這會有所幫助。
那麼無論如何要讓程序等到線程結束之後再繼續while循環呢?
在關機前使用FutureTask瞭解任務的狀態。 http://www.javacodegeeks.com/2013/07/java-futuretask-example-program.html – kosa
提示:ExecutorService#submit()'返回什麼? –
有一個新的ExecutorService實例有什麼問題? –