gpt4 book ai didi

独立对象之间的 Java 线程处理

转载 作者:行者123 更新时间:2023-11-30 07:20:19 26 4
gpt4 key购买 nike

当我尝试学习 Java 线程时,我通常会在同一个类中遇到带有 wait()notify() 的代码示例(事实上差不多所有这些都是生产者-消费者的例子)。在谷歌搜索各种示例后,不幸的是我找不到我需要的案例:

  • 管理器线程最初创建 n 个线程(并启动它们),其中一个 http get 请求在单个线程中完成。
  • 对于单个工作线程,完成其生命周期大约需要 20-30 秒。
  • 在这里,我的经理线程必须知道哪些 worker 已经完成,并用一个新线程替换完成的线程。

我想到了这样的方法(让 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 标志。但我不确定这是不是一个好方法(据我所知这是资源浪费)

最佳答案

在 Java 6 及更高版本中有一个现成的工具,以执行器框架的形式。

既然你想有一个固定的线程池,你最好的办法是使用:

ExecutorService service = Executors.newFixedThreadPool(5);

然后您可以提交您的 Runnable使用 .execute() 的实例方法(由 Executor 接口(interface)定义)。一旦池中的线程可用,它们将被提交到工作队列并出列。

如果您的各个线程工作方法返回一个值(即,它们实现了 Callable<Something> ),那么您可以使用 .submit()方法(由 ExecutorService 定义,也是一个扩展 Executor 的接口(interface)),它将返回一个 Future<Something>你将从中.get()计算值。

终止线程池有多种方式:.shutdown()是最基本的,将同步等待仍然活跃的线程终止(并阻止提交新作业)。

Javadocs:Executors , ExecutorService , ThreadPoolExecutor .

其他链接:a book you should buy for all things thread-related (但不包括 Java 7 的 ForkJoinPool)。

PS:真幸运,sample chapter of the book above (PDF)涵盖任务执行;)

关于独立对象之间的 Java 线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com