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

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

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

如果你的第二个function没有完成,它与你的函数返回无关。 如果有东西调用System.exit()或者你的函数抛出exception,那么线程就会停止。 否则,即使主线程停止,它也会一直运行直到完成。 可以通过将新线程设置为守护进程来防止这种情况,但是您没有在此处执行此操作。

您可以通过在临时线程中创建第二个线程来创建真正的异步线程。

 (new Thread(new Runnable() { public void run() { (new Thread(new Runnable() { public void run() { /* async thread */ }})).start(); }})).start();