如何实现真正的异步java线程
我有一个需要执行两个操作的函数,一个快速完成,另一个需要很长时间才能运行。 我希望能够将长时间运行的操作委托给一个线程,我不关心线程何时完成,但线程需要完成。 我实现了如下所示,但是,我的第二次操作永远不会完成,因为函数在start()调用之后退出。 我如何确保函数返回但第二个操作线程也完成其执行并且不依赖于父线程?
public void someFunction(String data) { smallOperation() SecondOperation a = new SecondOperation(); Thread th = new Thread(a); th.Start(); } class SecondOperation implements Runnable { public void run(){ // doSomething long running } }
public void someFunction(final String data) { shortOperation(data); new Thread(new Runnable() { public void run(){ longOperation(data); } }).start(); }
如果someFunction
,则JVM将运行longOperation
if
- 运行它的线程没有标记为守护进程 (在上面的代码中它不是)
-
longOperation()
不会抛出exception - 在
longOperation()
没有调用System.exitlongOperation()
在线程终止之前,JVM不会退出。 您发布的此代码甚至无法编译; 也许问题在于你的实际代码。
如果你的第二个function没有完成,它与你的函数返回无关。 如果有东西调用System.exit()
或者你的函数抛出exception,那么线程就会停止。 否则,即使主线程停止,它也会一直运行直到完成。 可以通过将新线程设置为守护进程来防止这种情况,但是您没有在此处执行此操作。
您可以通过在临时线程中创建第二个线程来创建真正的异步线程。
(new Thread(new Runnable() { public void run() { (new Thread(new Runnable() { public void run() { /* async thread */ }})).start(); }})).start();
- 从自定义类导入时,无法对XMLBeans jar进行签名
- 使用Apache POI 4.0运行官方示例LineChars和ScatterChart时出现问题
- 将数据从Oracle /关系表索引到弹性搜索的更好方法是什么?
- 是否可以制作JavaFX Web applet?
- 关于使用Ebean的Play Framework和MySQL的简单CRUD教程?
- 是否可以在同一台机器上运行套接字服务器和套接字客户端?
- Java中的多人游戏。 将客户端(播放器)连接到由其他客户端创建的游戏
- 如何使用Selenium WebDriver和Java从图像(validation码)中读取文本
- 使用Jackson注释将子数组解析为JSON?