如何实现真正的异步 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
 }
} 

答案 1
public void someFunction(final String data) {
    shortOperation(data);
    new Thread(new Runnable() {
        public void run(){
            longOperation(data);
        }
    }).start();
}

如果 调用 ,则 JVM 将运行 ifsomeFunctionlongOperation

  1. 运行它的线程未标记为守护程序(在上面的代码中它不是)
  2. 不会引发异常,并且longOperation()
  3. 没有对 System.exit() 的调用longOperation()

答案 2

在线程终止之前,JVM 不会退出。您发布的此代码甚至无法编译;也许问题出在你的实际代码中。


推荐