如何发出多个 SwingWorker 都已完成的信号?
How to signal that multiple SwingWorkers are all done?
我有以下问题,或者想做,我有 n 个 运行ning SwingWorker,数量可以在 1 到 10 之间变化。我从一个主线程启动它们,并在 n 个中创建它们数,然后让它们 运行。在完成所有 n 个 SwingWorkers 之后,我想做另一个任务,它基本上使用信息,SwingWorkers 处理并将它们全部加入主线程以对其进行处理。但是要开始此任务,所有 n 个 SwingWorker 都需要 finished/done 并且所有 n 个 SwingWorker 都需要成功完成。
最好的方法是什么? Java 中是否已经有一种机制可以执行类似的操作,例如 ThreadManager,您可以将多个 SwingWorker 放入其中,然后它会向主线程触发 doneAll() 或类似的东西?
主线程同时在做其他事情,不能等n个SwingWorker完成。我需要一个“全部完成”的火灾事件。
我想在主线程中创建另一个线程,运行它是一个 while 循环(untillAllSWFfinished),在循环中等待 500 毫秒进行检查,但这对我来说似乎有点脏。
有没有更优雅的方法来实现这个?
如果您知道要启动多少工人,则可以使用 CountdownLatch。如果你不知道有多少作品正在启动,你可以使用Phaser。
示例:
//using a button as a basic UI component to do work.
JButton button = new JButton(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Runnable control = new Runnable() {
@Override
public void run() {
//assuming we know we're going to do 20 bits of isolated work.
final CountDownLatch latch = new CountDownLatch(20);
for (int i = 0; i < 20; i++) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
//do your work
return null;
}
@Override
public void done() {
latch.countDown();
}
};
worker.run()
}
try {
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
//so your next bit of work.
}
};
SwingUtilities.invokeLater(control);
}
});
我有以下问题,或者想做,我有 n 个 运行ning SwingWorker,数量可以在 1 到 10 之间变化。我从一个主线程启动它们,并在 n 个中创建它们数,然后让它们 运行。在完成所有 n 个 SwingWorkers 之后,我想做另一个任务,它基本上使用信息,SwingWorkers 处理并将它们全部加入主线程以对其进行处理。但是要开始此任务,所有 n 个 SwingWorker 都需要 finished/done 并且所有 n 个 SwingWorker 都需要成功完成。
最好的方法是什么? Java 中是否已经有一种机制可以执行类似的操作,例如 ThreadManager,您可以将多个 SwingWorker 放入其中,然后它会向主线程触发 doneAll() 或类似的东西?
主线程同时在做其他事情,不能等n个SwingWorker完成。我需要一个“全部完成”的火灾事件。
我想在主线程中创建另一个线程,运行它是一个 while 循环(untillAllSWFfinished),在循环中等待 500 毫秒进行检查,但这对我来说似乎有点脏。
有没有更优雅的方法来实现这个?
如果您知道要启动多少工人,则可以使用 CountdownLatch。如果你不知道有多少作品正在启动,你可以使用Phaser。
示例:
//using a button as a basic UI component to do work.
JButton button = new JButton(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Runnable control = new Runnable() {
@Override
public void run() {
//assuming we know we're going to do 20 bits of isolated work.
final CountDownLatch latch = new CountDownLatch(20);
for (int i = 0; i < 20; i++) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
//do your work
return null;
}
@Override
public void done() {
latch.countDown();
}
};
worker.run()
}
try {
latch.await();
} catch (Exception e) {
e.printStackTrace();
}
//so your next bit of work.
}
};
SwingUtilities.invokeLater(control);
}
});