0
我有一個TableView與一些數據相關聯,一旦我點擊運行按鈕,我對該數據執行一些處理。每行數據都在一個單獨的線程中處理,並且這些線程正在運行時,我希望ProgressInducator可以替換其vbox中的表。用VBox中的ProgressIndicator替換TableView JavaFX
在所附的代碼:
如果我把車子停在是說「工作,如果停在這裏」 - 表被替換爲圓周率。 如果我繼續等待線程加入 - 無需替換。 我錯過了什麼?
runButton.setOnAction(
new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent e) {
List<Thread> threadList = new ArrayList<Thread>();
int threadCounter = 0;
final ProgressIndicator pi = new ProgressIndicator(threadCounter);
vbox.getChildren().clear();
vbox.getChildren().addAll(pi);
for (ProductInTable product : data) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try
{
product.calculate();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
});
threadList.add(thread);
thread.start();
}
int x = threadList.size();
/** WORKS IF STOP HERE **/
// wait for all threads to end
for (Thread t : threadList) {
try {
t.join();
threadCounter++;
pi.setProgress(threadCounter/x);
} catch (InterruptedException interE) {
interE.printStackTrace();
}
}
/** DOESNT WORKS IF STOP HERE **/
有多少線程太多? – sinai 2014-10-07 10:40:30
這取決於平臺,我對這個問題沒有很好的答案。我想我總是儘量保持在與系統上的處理器數量相同的數量級上;但我不確定這是否是一項好的政策。如果您有疑問,我建議使用'ExecutorService'來管理日程安排。 – 2014-10-07 12:52:36