Java:在原始线程的上下文中从另一个线程调用回调

时间:2017-01-31 07:30:46

标签: java multithreading thread-safety

我有点惭愧地问这个基本问题,但现在是。

我们说我有一个主类和一个工作线程。工作线程执行一些异步工作,并将结果返回给主类的回调。

现在我正在努力的是:主类的回调是作为工作线程的一部分执行的。我已经做了十几次,它从来没有给我带来任何问题,但我想知道如何优雅地将工作线程的响应传递给实际的主线程。

我知道我可以使用FutureFutureTask等,但对我来说却很笨拙。

示例:

class ThreadTest {
        private Runnable mRunnable;

        public ThreadTest() {
                System.out.println("ThreadTest(): thread " + Thread.currentThread().getId());
                mRunnable = new Runnable() {
                        public void run() {
                                System.out.println("run(): thread " + Thread.currentThread().getId());
                                print();
                        }
                };
                new Thread(mRunnable).start();
        }
        private void print() {
                System.out.println("print(): thread " + Thread.currentThread().getId());
        }
        public static void main(String... args) {
                System.out.println("main(): thread " + Thread.currentThread().getId());
                ThreadTest t = new ThreadTest();
        }
}

输出:

main(): thread 1
ThreadTest(): thread 1
run(): thread 9
print(): thread 9

我想得到什么:

main(): thread 1
ThreadTest(): thread 1
run(): thread 9
print(): thread 1

2 个答案:

答案 0 :(得分:1)

此类问题的一个常见解决方案是在主线程和工作线程之间提供“通信通道”。

换句话说:你把一个数据结构放在一方可以写,另一方可以读。

这样做的常用方法是使用ConcurrentLinkedQueue。 有关详细信息,请参阅here;包括简单的生产者/消费者情景。

除此之外,你应该更清楚你的设计。我的意思是:我要么专注于

  1. 执行某项操作的工作线程,并使用Future
  2. 提供结果(用于“拾取”)
  3. 某些线程B在某个时刻触发主线程的回调。
  4. 换句话说:这可以被视为“拉”(使用Future)或“推”(线程B调用回调方法)。我建议决定一个概念,而不是同时使用两个概念的“50%”!

答案 1 :(得分:1)

最简单的解决方案是使用wait()notify()

作为旁注,我认为期货没什么笨重的,特别是如果我们谈论的是java8和CompletableFuture