Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8092556

[Task] cancellation makes the Task code throw IllegalStateException

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: P4
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 8u20
    • Component/s: javafx
    • Labels:
    • Subcomponent:

      Description

      Code to reproduce:

       @Override public void start(Stage stage) throws ExecutionException, InterruptedException {
              Task task = new Task() {
                  @Override
                  protected Object call() throws Exception {
                      cancel();
                      return null;
                  }
              };

              Service service = new Service() {
                  @Override
                  protected Task createTask() {
                      return task;
                  }
              };


              task.stateProperty().addListener((ob, o, n) -> {
                  if ( n == Worker.State.CANCELLED) {
                      System.out.println("Task cancelled");
                  }
              });

              task.exceptionProperty().addListener(new ChangeListener<Throwable>() {
                  @Override
                  public void changed(ObservableValue ob, Throwable o, Throwable n) {
                      System.out.println("Exception set:");
                      n.printStackTrace(System.out);
                      Platform.exit();
                  }
              });

              service.start();
          }


      When a Task is cancelled, task.getValue() is called in the Executor (i.e. outside of App thread), but getValue() checks for FX thread, which results in the following Exception instead of returning the value:

      java.lang.IllegalStateException: Task must only be used from the FX Application Thread
      at javafx.concurrent.Task.checkThread(Task.java:1209)
      at javafx.concurrent.Task.getValue(Task.java:962)
      at javafx.concurrent.Task$TaskCallable.call(Task.java:1432)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at javafx.concurrent.Service.lambda$null$209(Service.java:724)
      at javafx.concurrent.Service$$Lambda$65/955538869.run(Unknown Source)
      at java.security.AccessController.doPrivileged(Native Method)
      at javafx.concurrent.Service.lambda$executeTask$210(Service.java:723)
      at javafx.concurrent.Service$$Lambda$63/1990188857.run(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:744)

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              msladecek Martin Sládeček
              Reporter:
              msladecek Martin Sládeček
              Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:
                Imported: