java - 如何实现一个真正的异步 java 线程

标签 java multithreading asynchronous runnable

我有一个函数需要执行两个操作,一个完成得很快,另一个需要很长时间才能运行。我希望能够将长时间运行的操作委托(delegate)给一个线程,我不关心线程何时完成,但线程需要完成。我如下所示实现了它,但是,我的第二个操作从未完成,因为函数在 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 如果

  1. 运行它的线程没有被标记 作为一个守护进程(在上面的代码中它 不是)
  2. longOperation() 不会抛出异常
  3. longOperation() 中没有调用 System.exit()

关于java - 如何实现一个真正的异步 java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676687/

相关文章:

java - OnKeyListener.onKey 未被调用

android - 如何使用暴力取消 AsyncTask

database - 如何将 Diesel 与 SQLite 连接一起使用并避免 `database is locked` 类型的错误

java - 为什么 CLH Lock 在 java 中需要 prev-Node

node.js - 在 NodeJS 中发送 HTTP 响应之前等待事件发生?

c# - 当外部输入/输出 API 提供自己的回调委托(delegate)时使用异步和等待

asynchronous - 由 webfontloader 加载的谷歌字体呈现阻塞

java - JDBC-ORA-00984 : column not allowed here

java - 如何在没有dex的情况下在Android上加载类

java - Jackson 序列化枚举和非传统 setter / getter