2013-04-16 31 views
10

我是JavaFX的新手,我对线程有点问题:我可以执行两次,但我找不到原因。JavaFX:不止一次使用线程

这里是我的代码和-UPT:

Task<Void> task = new Task<Void>() { 
    @Override public Void call() throws ImageLoadedException, HomographyException, IOException { 
     try{ 
      System.out.println("GO !"); 
      return null; 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @Override 
    protected void succeeded() { 
     super.succeeded(); 
     System.out.println("SUCCEEDED"); 
    } 
}; 

@FXML protected void launch(ActionEvent event){ 
    new Thread(task).start(); 
} 

当我点击第一时间谁开始我的线程的按钮,我没有任何问题的任务运行(我的控制台显示“GO!”和“成功“)。

但是,如果我第二次点击,没有附加任何东西。难道我做错了什么 ?我们不能多次使用一个线程吗?

+1

不,你不能使用一个线程不止一次。 – xagyg

回答

11

Thread.start()文档:没有

这是从来没有的法律,以启动一个线程不止一次。特别是,线程在完成执行后可能不会重新启动。

Concurrency in JavaFX教程:

Task类定义了不能被重新使用一次性对象。如果 需要可重用的Worker对象,请使用Service类。

所以,你必须考虑Service类而不是Task


编辑:这应该为你工作:

Service<Void> service = new Service<>(task); 

@FXML protected void launch(ActionEvent event){ 
    if (!service.isRunning()) { 
     service.reset(); 
     service.start(); 
    } 
} 
+0

非常感谢您的帮助。我会马上寻找:) – SylCh

+0

记得自己设置执行程序并重用它,或者您仍然在任何地方创建新线程。 –

+0

@AndyTill你能提出一个更好的方法吗? – tarrsalah

0

与wraper类

  import java.io.IOException; 
      import javafx.concurrent.Task; 

      public class Executor { 
       private String name; 
       private Task<Void> task; 

       public Executor(final String name) { 
        this.name=name; 
        task = new Task<Void>() { 
         @Override 
         public Void call() throws IOException, InterruptedException { 
          try { 
           int i=0; 
           while(i<20){ 
            System.out.println(name); 
            Thread.sleep(2000); 
            i++; 
           } 
           return null; 
          } catch (IllegalThreadStateException e) { 
           System.out.println(e); 
          } 
          return null; 
         } 

         @Override 
         protected void succeeded() { 
          super.succeeded(); 
          try { 
           System.out.println(name+" finish"); 
          } catch (Exception ex) { 
           System.out.println(ex); 
          } 
         } 
        }; 
       } 

       public void start() { 
        try { 
           Thread th = new Thread(task); 
           th.start(); 
          } catch (Exception ex) { 
           System.out.println(ex); 
          } 
       } 
      } 
+0

你的代码如何帮助解决这个问题? –

+1

您可以根据需要多次运行任务 –

1

一个按钮做它可以发射新的任务

    Button btn = new Button(); 
        btn.setText("New task"); 
        btn.setOnAction(new EventHandler<ActionEvent>() { 
         @Override 
         public void handle(ActionEvent event) { 
          Executor ex=new Executor("Task"+count); 
          ex.start(); 
          count++; 
          System.out.println("Task Starting..."); 
         } 
        });