java - 如何将队列从另一个线程添加到一个线程?
问题描述
我正在尝试找到一种将队列从不同线程添加到一个线程的方法。
这是一个例子:
public void actionPerformed(ActionEvent e) {
System.out.println("something happened.");
}
我相信该方法actionPerformed
将始终在 EDT 中执行,但由于该方法中的代码与摆动无关,我想将其安排到不同的线程。
有一种方法可以让您在 EDT 中安排任务,例如:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//insert some code that does something in EDT
}
});
有没有办法做同样的事情,但对于一个普通的线程?
解决方案
如果您对要使用的后台线程没有特别的偏好,请尝试使用ForkJoinPool
common pool。
静态
commonPool()
可用且适用于大多数应用程序。ForkJoinTask
未明确提交到指定池的任何人都使用公共池。使用公共池通常会减少资源使用(其线程在不使用期间缓慢回收,并在后续使用时恢复)。
您可以通过多种不同方式提交作业。我建议通过CompletableFuture
它来检查工作的状态和结果。它的所有xxxAsync()
方法都将任务提交到 fork-join 公共池。
如果您不关心结果,您可以简单地调用runAsync()
即发即弃样式:
CompletableFuture.runAsync(() -> {
System.out.println("something happened.");
});
或者,如果您想计算线程外的值,您可以使用方法链接在作业完成时采取行动:
CompletableFuture.supplyAsync(() -> {
// expensive computation
return result;
})
.whenComplete((result, exception) -> {
if (exception == null) {
System.out.println("result is " + result);
}
else {
// something went wrong
exception.printStackTrace();
}
});
推荐阅读
- angular - 动态添加路由到子组件角度 5
- android - 如果用户在年龄的编辑文本中输入字母,如何指示错误?(安卓工作室)
- neural-network - 如果我不能在神经网络中进行大批量处理,如何进行补偿
- c# - C#无法在自定义验证属性中找到其他属性
- angularjs - 文件上传期间Angularjs表单数据未绑定在服务器端
- github - 如何在我的 android github 项目中上传演示图像
- android - 致命异常:java.lang.IllegalArgumentException:接收器未注册:android.hardware.camera2.CameraManager
- logging - 在机器人框架中实时写入日志文件
- php - 我的重置密码密码系统给了我一个数据库错误
- excel - 无法添加表 'SELECT('