恢复线程并在Java中传入对象

时间:2013-03-09 15:22:51

标签: java multithreading object

我对java中的线程比较新。我想知道以下是否可行。

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

谢谢!

4 个答案:

答案 0 :(得分:2)

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

以下示例通常是完成任务的最佳方式。它在主线程中做了一些工作然后将Callable传递给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默认使用非守护程序线程,因此应用程序在关闭之前不会退出。

答案 1 :(得分:1)

如果你想让你的生活更轻松使用java中的Threads不使用wait(),notify()你将不得不使用synchronized方法和语句,我的建议是使用你从中传递的ReentrantLock和Condition辅助线程的主线程

Here you can read more about it

答案 2 :(得分:0)

线程a等待take()的{​​{3}}和线程b put()的结果如何?

  

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

如果您想要添加超时,请为poll()添加结果,并为其offer()添加帖子。

答案 3 :(得分:0)

我认为您所寻找的是java.util.Callablejava.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();
        }
    }
}