我有一堆我想通過線程池執行的runnables。但是,每個runnable還會將某些結果寫入某個文件。所以現在,Runnable的界面很簡單:執行程序中的每個線程的Java關聯對象
class MyRunnable implements Runnable {
...
MyRunnable(BufferedWriter writer, Task t) {
this.writer = writer;
this.task = t;
}
public void run() {
...
this.writer.write(SOME_DATA);
}
}
但是,我想要的是一個的BufferedWriter(換句話說,一個輸出文件),每個執行程序中的池線程的關聯。不過,我打電話使用ExecutorService
像.execute
功能如下:
BufferedWriter[] writers = initialize to 20 BufferedWriters;
ExecutorService executor = Executors.newFixedThreadPool(20);
for (Task t : tasks) {
MyRunnable runnable = new MyRunnable(WHAT SHOULD GO HERE?, t)
executor.execute(runnable);
}
我不知道哪個線程執行將分配給運行給定的任務,所以我不知道我應該提供的BufferedWriter到可運行。我如何確保由ExecutorService管理的每個線程都與一個對象(在本例中爲BufferedWriter)相關聯?
lol,同時實現@ djechlin的答案我遇到了不能關閉編寫器的確切問題-.-因此,你推薦的基本上是管理我自己的線程池,並且每個線程都會拉動從同步源? – Jin
那麼你仍然可以使用'ExecutorService'來管理總是推薦@Jin的線程。但是他們是否從你的'BlockingQueue'中抽出了他們的任務。 – Gray
大聲笑我只是想到另一個更簡單但是哈克解決方案..運行「關閉緩衝作家」可以在一切完成後運行xD – Jin