【问题标题】:Java: Call a callback from another thread, in the context of the original threadJava:在原始线程的上下文中从另一个线程调用回调
【发布时间】:2017-01-31 07:30:46
【问题描述】:

我有点不好意思问这个基本问题,但就是这样。

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

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

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

【问题讨论】:

  • 你说的完全正确,我刚离开电脑一两个小时......
  • 那没关系;-.)

标签: java multithreading thread-safety


【解决方案1】:

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

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

通常的方法是使用 ConcurrentLinkedQueue。 请参阅here 进一步阅读;包括一个简单的生产者/消费者场景。

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

  1. 一个工作线程,它做某事并使用 Future 提供结果(用于“拾取”)
  2. 某个线程 B 在某个时间点在您的主线程上触发回调。

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

【讨论】:

    【解决方案2】:

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

    作为旁注,我认为期货并没有什么笨拙的地方,尤其是当我们谈论 java8 和 CompletableFuture 时。

    【讨论】:

    • 同意,期货本身并不笨重。
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多