0

我对java中的线程比较陌生。我想知道以下是否可能。

  • (从另一个对象)调用线程 [a]。
  • 它做了一些事情,然后在同一个对象中启动另一个线程 [b]。
  • 然后它会暂停自己并等待另一个线程完成。
  • 当它完成时,它将正在处理的结果传递给暂停的线程 [a] 并恢复它。
  • 然后线程 [a] 将结果返回给调用它的原始对象。

谢谢!

4

4 回答 4

2

有很多方法可以做到这一点。

以下示例通常是完成任务的最佳方式。它在主线程中做一些工作,然后将 a 传递给在另一个线程中做一些工作的Callablean 。ExecutorService调用future.get阻塞直到第二个线程完成并返回返回的Object那个Callable

private static final ExecutorService executorService = Executors.newFixedThreadPool(1);

public static void main(String[] args) {
    //do some stuff       
    final Future<Object> future = executorService.submit(new MyOtherWork());
    final Object object;
    try {
        object = future.get();
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    } catch (ExecutionException ex) {
        //handle exception
    }       
    //do some other stuff

}

private static class MyOtherWork implements Callable<Object> {

    public Object call() throws Exception {
        //do stuff in another thread
    }
}

请注意,由于ExecutorService默认情况下使用非守护线程,因此您的应用程序在关闭之前不会退出。

于 2013-03-09T15:51:04.847 回答
1

如果您想使用 Java 中的线程让您的生活更轻松,请不要使用 wait()、notify(),您将不得不使用同步方法和语句,我的建议是使用从主线程传递到的 ReentrantLock 和 Condition次要线程

在这里你可以阅读更多关于它的信息

于 2013-03-09T15:40:36.793 回答
0

线程 a 正在等待的SynchronousQueuetake()和线程 bput()的结果如何?

同步队列类似于 CSP 和 Ada 中使用的集合通道。它们非常适合切换设计,其中一个线程中运行的对象必须与另一个线程中运行的对象同步,以便将一些信息、事件或任务交给它。

如果要添加超时,请让线程 apoll()获得结果,线程 b 获得结果offer()

于 2013-03-09T15:31:49.943 回答
0

我认为您正在寻找的是java.util.Callableand java.util.Executors

这是我能写的最短的代码:

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

public class TestCallable {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService executor = Executors.newSingleThreadExecutor();
        try {
            Integer five = executor.submit(new Callable<Integer>() {

                @Override
                public Integer call() throws Exception {
                    ExecutorService executor = Executors.newSingleThreadExecutor();
                    try {
                        return executor.submit(new Callable<Integer>() {

                            @Override
                            public Integer call() throws Exception {
                                return 5;
                            }

                        }).get();
                    } finally {
                        executor.shutdown();
                    }
                }

            }).get();

            System.out.println(five); // prints 5

        } finally {
            executor.shutdown();
        }
    }
}
于 2013-03-09T16:17:44.583 回答