RFR: 8081474: SwingWorker calls 'done' before the 'doInBackground' is finished [v8]

Alexey Ivanov aivanov at openjdk.org
Wed Feb 1 17:17:52 UTC 2023


On Tue, 31 Jan 2023 23:53:18 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:

> How the updated code is supposed to work if the worker will have some state updated by the "doInBackground" and used by the "done" method.

What do you mean?

~~Not much has changed to the way `done` is called.~~ Previously `doneEDT` was called from `FutureTask` implementation, its overridden `done` method. Now, `doneEDT` is called right from `doInBackground`.

Thus, if `cancel` was called on EDT, `doneEDT` and consequently `SwingWorker.done` were called on EDT (the latter was called synchronously). That is `doneEDT` was called on the thread which called `cancel`.

Now, `doneEDT` is always called on the background thread whether it's cancelled or not.

Yet no one should have depended on that because it was an implementation detail rather than a contract.

> I guess if the "doInBackground" will be canceled the "done" method may throw an exception?

Why is it? `done` cannot throw exceptions.

This entire scenario is where *`doInBackground` is cancelled* but `done` gets called before `doInBackground` exits.

Yet `get` method throws `CancellationException` if the work for `doInBackground` is cancelled. It's specified in the [`Future` interface](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/Future.html#get()).

> Do we have such usage in our codebase?

I found the [`CheckCancellationException.java`](https://github.com/openjdk/jdk/blob/master/test/jdk/javax/swing/SwingWorker/6608234/CheckCancellationException.java) test that you wrote. It verifies that calling `get` throws `CancellationException`.

`SwingWorker` is used in `JEditorPane` as well as in `jconsole` packages. Yet I didn't look into the details how it's used.

-------------

PR: https://git.openjdk.org/jdk/pull/11940



More information about the client-libs-dev mailing list