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

问题描述 投票:16回答:6

我有一个需要执行两个操作的函数,一个快速完成,另一个需要很长时间才能运行。我希望能够将长时间运行的操作委托给一个线程,我不在乎线程何时完成,但线程需要完成。我实现了如下所示,但是,我的第二次操作永远不会完成,因为函数在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
 }
} 
java multithreading asynchronous runnable
6个回答
40
投票
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()不会抛出异常
  3. longOperation()中没有调用System.exit()

1
投票

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


1
投票

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


0
投票

解决方案使用现代Java

public void someFunction(String data) {
    smallOperation();
    new Thread(() -> {
        // doSomething long running
    }).start();
}

0
投票

回答这个问题可能会迟到,但这是有效的解决方案。只需将runnables添加到ExecutorService即可。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

ExecutorService executor = Executors.newFixedThreadPool(10);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                //your code
            }
        });

-1
投票

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

(new Thread(new Runnable() { public void run() {
    (new Thread(new Runnable() { public void run()
    {
        /* async thread */
    }})).start();
}})).start();
© www.soinside.com 2019 - 2024. All rights reserved.