The done() method not being executed after doInBackground() is finished.
I have the following code:
public class collectingWorker_USB4Java_Async_Fast extends SwingWorker<Void, Void> {
collectingWorker_USB4Java_Async_Fast(String name) {
//initialize
collectingWorkerDone = false;
}
@Override
public Void doInBackground() {
loop = true;
while(loop){
collectData();
try {
synchronized(TransferCallbackData) {
TransferCallbackData.wait();
}
} catch (InterruptedException ex) {
Logger.getLogger(GraphPanel_JChart2D.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("Out of the loop of collecting worker, loop: " + loop);
return null;
}
@Override
protected void done() {
collectingWorkerDone = true;
System.out.println("Collecting worker DONE");
}
}
But for some reason it is not executed after the doInBackground() is finished.
I have the worker in a while loop. To finished it I just set a boolean (loop) to false.
public void StartPlotting(){
Graphs.createCollectingThread();
Graphs.collectWorker_usb4java_async_fast.execute();
}
public void StopPlotting(){
if (Graphs.collectWorker_usb4java_async_fast != null){
if (Graphs.collectWorker_usb4java_async_fast.getState() == SwingWorker.StateValue.STARTED){
Graphs.collectWorker_usb4java_async_fast.loop = false;
}
//wait until plotting is done
synchronized(Graphs.collectWorker_usb4java_async_fast.TransferCallbackData){
Graphs.collectWorker_usb4java_async_fast.TransferCallbackData.notify();
}
while(Graphs.collectWorker_usb4java_async_fast.getState() != SwingWorker.StateValue.DONE){
synchronized(Graphs.collectWorker_usb4java_async_fast.TransferCallbackData){
Graphs.collectWorker_usb4java_async_fast.TransferCallbackData.notify();
}
}
}
}
public void StopPlottingWithCheck(){
if (Graphs.collectWorker_usb4java_async_fast != null){
if (Graphs.collectWorker_usb4java_async_fast.getState() == SwingWorker.StateValue.STARTED){
Graphs.collectWorker_usb4java_async_fast.loop = false;
}
//wait until plotting is done
synchronized(Graphs.collectWorker_usb4java_async_fast.TransferCallbackData){
Graphs.collectWorker_usb4java_async_fast.TransferCallbackData.notify();
}
while(Graphs.collectWorker_usb4java_async_fast.getState() != SwingWorker.StateValue.DONE){
synchronized(Graphs.collectWorker_usb4java_async_fast.TransferCallbackData){
Graphs.collectWorker_usb4java_async_fast.TransferCallbackData.notify();
}
}
}
while(Graphs.collectingWorkerDone != true){
//wait unil transfers dont receive more data
}
}
If StopPlotting() is called just like that, I get:
Collecting worker DONE
However, if I StopPlottingWithCheck() is called, the code stalls.
In debug mode, I can see that the done() method is executed as soon as StopPlotting() is finished, this leads me to think that I have an EDT synchronization issue or something similar.
Is there any way to ensure that the done() method is executed right away after doInBackground() is finished?