Why stopping a SwingWorker does stop it immediately?

43 Views Asked by At

I'm using a SwingWorker to execute some repeatable tasks in background. This is my Class:

public class CMyThread {

    private SwingWorker<Object, Void> taskWorker;
    public volatile boolean threadDone = false;
        
    public CMyThread() {
    }

    @Override
    public void stop() {
        taskWorker.cancel(true);
    }

    @Override
    public void start() {
        taskWorker = new SwingWorker<Object, Void>() {
            @Override
            public Object doInBackground() {
                while (!isCancelled()) {
                    // SOMETHING TIMECONSUMING THAT NEEDS TO BE DONE REPEATEDLY
                    CUtils.sleep(10000);
                }
                threadDone = true;
                return null;
            }

            @Override
            public void done() {
            }
        };
        taskWorker.execute();
    }
    
    public void waitThreadToGentlyFinish() { // called when we call destroy() on the servlet
        while (!threadDone) {
            System.out.print("#");
            CUtils.sleep(200);
        }
    }
}

And this is called this way:

CMyThread myThread = new CMyThread();
myThread.start();

Now, at one point I want to gently stop the thread. So I call

myThread.stop();
myThread.waitThreadToGentlyFinish();

I'm expecting that the currently running [ACTION] is going to take time to finish, then only it will exit the loop and set the flag 'threadDone' to true. but what I actually see is that it exits the loop immediately and I never see any '#' characters displayed.

There is obviously something wrong in my code but I can't see the obvious. Any idea guys ?

0

There are 0 best solutions below