gpt4 book ai didi

java - java中的多线程

转载 作者:行者123 更新时间:2023-12-01 07:10:58 27 4
gpt4 key购买 nike

我有一个多线程程序,我希望其中一个线程在所有线程完成后打印语句。我该怎么做?以及我如何知道所有线程都已完成?

ExecutorService pool = Executors.newCachedThreadPool();
for(int i = 0; i < myList.size(); ++i) {
pool.execute (new ThreadProcessRunnable (args));
}


public class ThreadProcessRunnable implements Runnable {
public void run() {


System.out.println("last thread should execute this");
}
}

最佳答案

这听起来像是 ExecutorService.invokeAll 的理想用例:

ExecutorService pool = Executors.newCachedThreadPool();
List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();
for(int i = 0; i < myList.size(); ++i) {
tasks.add (Executors.callable(new ThreadProcessRunnable (args)));
}
List<Future<Object>> futures = pool.invokeAll(tasks);
System.out.println("All tasks finished");


public class ThreadProcessRunnable implements Runnable {
public void run() {
// do some stuff
}
}

invokeAll 会阻塞,直到提供的 List 中的所有任务都完成。

如果您绝对必须在线程的一个 run 方法中包含 println ,那么我能想到的最简单的方法就是在其中保留某种计数器一个AtomicInteger

public class ThreadProcessRunnable implements Runnable {
private AtomicInteger taskCounter;

public ThreadProcessRunnable(AtomicInteger counter) {
this.taskCounter = counter;
}

public void run() {
// do stuff
if(taskCounter.decrementAndGet() == 0) {
System.out.println("I am the last thread and I am about to finish");
}
}
}

// Main class
ExecutorService pool = Executors.newCachedThreadPool();
AtomicInteger taskCounter = new AtomicInteger(myList.size());
for(int i = 0; i < myList.size(); ++i) {
pool.execute(new ThreadProcessRunnable(taskCounter));
}

使这项工作有效的关键是 taskCounter.decrementAndGet原子 - 例如,如果 taskCounter 的值最初为 2 ,并且两个不同的线程同时调用 decrementAndGet 那么就保证一个线程会看到值 1,另一个线程会看到值 0,所以只有一个线程会打印“about to”完成”消息。这与 MadProgrammer's answer 不同,其中涉及竞争条件:

latch.countDown();
if(latch.getCount() == 0) { ... }

可以让线程 1 将值递减(至 1),然后线程 2 再次将其递减(至 0),然后两个线程在调用 时都会看到值 0 getCount打印消息。

关于java - java中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14388926/

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