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