代码之家  ›  专栏  ›  技术社区  ›  Ritesh M Nayak beny23

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

  •  16
  • Ritesh M Nayak beny23  · 技术社区  · 15 年前

    我有一个函数需要执行两个操作,一个完成得很快,另一个运行时间很长。我希望能够将长时间运行的操作委托给线程,我不关心线程何时结束,但线程需要完成。我实现了这一点,如下所示,但是,当函数在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
     }
    } 
    
    5 回复  |  直到 6 年前
        1
  •  39
  •   Yishai    15 年前
    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. 中没有调用System.Exit()。 长运算()
        2
  •  1
  •   danben    15 年前

    在线程终止之前,JVM不会退出。您发布的代码甚至不会编译;可能问题出在您的实际代码中。

        3
  •  1
  •   Yishai    15 年前

    如果第二个函数没有完成,它与函数返回无关。如果有什么需要 System.exit() 或者,如果函数抛出异常,那么线程将停止。否则,它将一直运行到完成为止,即使您的主线程停止了。这可以通过将新线程设置为守护进程来防止,但您在这里不这样做。

        4
  •  0
  •   shx    6 年前

    使用解决方案 现代的 爪哇

    public void someFunction(String data) {
        smallOperation();
        new Thread(() -> {
            // doSomething long running
        }).start();
    }
    
        5
  •  -1
  •   Martin Wantke    8 年前

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

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