【发布时间】:2013-01-02 07:20:17
【问题描述】:
当我尝试学习 Java 线程时,我通常会在同一个类中遇到 wait() 和 notify() 的代码示例(实际上几乎所有这些示例都是生产者-消费者示例)。在谷歌搜索各种示例后,不幸的是我找不到我需要的案例:
- 管理器线程最初创建 n 个线程(并启动它们),其中 http get 请求在单个线程中完成。
- 对于单个工作线程,完成其生命周期大约需要 20-30 秒。
- 这里我的经理线程必须知道哪些工人已经完成,并用一个新的替换完成线程。
我想过这样的方法(让 n 为 5):
List<Runnable> runnables = new ArrayList<Runnable>();
for(int i = 0 ; i < 5 ; i++){
runnables.add(new MyWorker(params));
}
for(Runnable myWorker : runnables){
myWorker.run();
}
由于wait() 不支持多个对象,我不能从这里继续下去。另一种解决方案是在为每个工作人员调用一些 isFinished 标志的管理器线程上实现繁忙等待。但我不确定这是否是一种好方法(据我所知这是资源浪费)
【问题讨论】:
-
您可能正在寻找
ThreadPoolExecutor。另请参阅实用程序类Executors,它具有适用于最常见场景的静态工厂方法。 -
@fge:您应该将其发布为答案(并详细说明)。
-
我不会费心等待和通知,这可能很难使用。 java.util.concurrent 包中的高级线程工具更易于使用。
-
@JBNizet 完成,请修正任何错误;)
-
你想强制每个线程顺序执行吗?在上面的代码中,您实际上并没有启动新线程,您只是调用每个 Thread 对象的 run 方法。没有发生多线程!真的取决于你想做什么。
标签: java multithreading