Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用新线程的最有效方法_Java_Multithreading_Javafx - Fatal编程技术网

Java 调用新线程的最有效方法

Java 调用新线程的最有效方法,java,multithreading,javafx,Java,Multithreading,Javafx,在JFX应用程序中有以下非常简单的意图:当按下键盘上的一个键并因此调用handleevent ev方法时,我希望在另一个未使用的线程中发生一些事情 到目前为止,我发现有三种选择: 直接在句柄中创建新线程: public void handle(KeyEvent ke) { new Thread(() -> { // THE CODE }).start(); } } 或者我在programm启动一个不同的线程,开始如下所示: public void run() {

在JFX应用程序中有以下非常简单的意图:当按下键盘上的一个键并因此调用handleevent ev方法时,我希望在另一个未使用的线程中发生一些事情

到目前为止,我发现有三种选择:

直接在句柄中创建新线程:

public void handle(KeyEvent ke)
{
  new Thread(() -> {
    // THE CODE
    }).start();
  }
}
或者我在programm启动一个不同的线程,开始如下所示:

public void run()
{
  while(true)
  {
    if (triggered)
    {
      // THE CODE
    }
  }
}
然后在handle方法中,我只是将triggered字段设置为true

第三种方法是创建需要并行执行的尽可能多的类扩展线程实例,并在句柄中使用它们的start函数

好的,从我所看到的,由于线程的创建,前一种方法有很大的开销

第二种方法毫无意义地需要99.9%的CPU资源。 这只能通过在循环中添加睡眠来削弱

第三种方法似乎与第一种方法非常相似,因为大多数资源都是在调用start时分配的,还是我错了? 该方法还有一个缺点,就是必须在memmory中保留多个实例,因为我无法预测将并行调用多少实例

你有什么建议? 还有其他的可能性吗


万分感谢

我建议将该任务添加到ExecutorService,它作为后台线程池工作,不使用时处于空闲状态。但是,其中的线程可以重用以提高效率。如果不知道一次需要多少线程,可以使用缓存线程池

static final ExecutorService executor = Executors.newCachedThreadPool();

public void handle(KeyEvent ke)
{
    executor.execute(() -> {
        // THE CODE
    });
}


我建议将该任务添加到ExecutorService,它作为后台线程池工作,不使用时处于空闲状态。但是,其中的线程可以重用以提高效率。如果不知道一次需要多少线程,可以使用缓存线程池

static final ExecutorService executor = Executors.newCachedThreadPool();

public void handle(KeyEvent ke)
{
    executor.execute(() -> {
        // THE CODE
    });
}

您可以使用,这样您就可以避免:

重复创建新线程 不必要地检查触发状态 像这样:

ExecutorService executor = executors.newcachedthreadpool();

public void handle(KeyEvent ke)
{
  Runnable runnable = new Runnable() {
      void run() {
          // code
      }
  }
  executor.execute(runnable);
}
您可以使用,这样您就可以避免:

重复创建新线程 不必要地检查触发状态 像这样:

ExecutorService executor = executors.newcachedthreadpool();

public void handle(KeyEvent ke)
{
  Runnable runnable = new Runnable() {
      void run() {
          // code
      }
  }
  executor.execute(runnable);
}

您可以使用JavaFX服务,也可以创建一个任务,通过新线程或使用执行器(例如从Executors.newCachedThreadPool)手动提交该任务

这些备选方案在本手册中有很好的介绍


根据您所写的内容,我可能会选择该服务,但这两种选择都应该有效。

您可以使用JavaFX服务或创建一个任务,使用新线程或使用执行器手动提交,例如从Executors.newCachedThreadPool

这些备选方案在本手册中有很好的介绍


根据您所写的内容,我可能会选择该服务,但两种选择都应该有效。

我建议学习使用lambdas,因为大多数IDE现在都有自动重构来使用它们。Java 10也是当前版本@是的,我正在努力。看起来很酷。我的公司正在使用jdk7:随着发布周期的加快,一些公司很难跟上时代的步伐。顺便说一句,Java 9是公共支持的终结,Java 10将在5个月后终结PI建议学习使用lambdas,因为大多数IDE现在都有自动重构来使用它们。Java 10也是当前版本@是的,我正在努力。看起来很酷。我的公司正在使用jdk7:随着发布周期的加快,一些公司很难跟上时代的步伐。顺便说一句,Java 9是公共支持的终结,Java 10将在5个月后终结P