fjc*_*fjc 5 java multithreading thread-safety
我有点羞于问这个基本问题,但就是这样。
假设我有一个主类和一个工作线程。工作线程执行一些异步工作并将结果返回到主类的回调。
现在我正在努力解决的是:主类的回调作为工作线程的一部分执行。我已经这样做了十几次,它从未对我造成任何问题,但我想知道如何优雅地将响应从工作线程传递回实际的主线程。
我知道我可以使用Future等等FutureTask,但对我来说感觉很笨重。
例子:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
main(): thread 1
ThreadTest(): thread 1
run(): thread 9
print(): thread 9
Run Code Online (Sandbox Code Playgroud)
我想得到什么:
main(): thread 1
ThreadTest(): thread 1
run(): thread 9
print(): thread 1
Run Code Online (Sandbox Code Playgroud)
此类问题的一种常见解决方案是在主线程和工作线程之间提供“通信通道”。
换句话说:您在一侧可以写入而另一侧可以读取的数据结构之间放置。
常见的方法是使用 ConcurrentLinkedQueue。请参阅此处进一步阅读;包括一个简单的生产者/消费者场景。
除此之外,你应该对你的设计更加清晰。我的意思是:我要么专注于
换句话说:这可以被视为“拉”(使用 Future)或“推”(线程 B 调用回调方法)。我建议决定一个概念,而不是同时使用两个概念的“50%”!
| 归档时间: |
|
| 查看次数: |
2936 次 |
| 最近记录: |