繁体   English   中英

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

[英]Java: Call a callback from another thread, in the context of the original thread

我有些as愧地问这个基本问题,但这是事实。

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

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

我知道我可以使用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

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

换句话说:您在一个数据结构之间放置了一侧可以写入而另一侧可以读取的数据结构。

常用的方法是使用ConcurrentLinkedQueue。 请参阅此处以进一步阅读; 包括简单的生产者/消费者方案。

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

  1. 一个执行某些操作并使用Future提供结果(用于“拾取”)的工作线程
  2. 某些线程B有时会在您的主线程上触发回调。

换句话说:这可以看作是“拉”(使用Future)或“推”(线程B调用回调方法)。 我建议决定一个概念,而不要同时使用两个概念的“ 50%”!

最不复杂的解决方案是使用wait()notify()

附带说明一下,我认为期货没有什么笨拙的,尤其是当我们谈论java8和CompletableFuture

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM