多线程并行、所有线程结束后输出任务完成
示例
java
package com.fd;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class Test3 {
public static void main(String[] args) throws InterruptedException {
AtomicInteger counter = new AtomicInteger(0);
for (int i = 0; i < 20; i++) {
final int index = i;
ThreadPoolUtil. execute(() -> { // 使用 lambda 表达式简化代码
System.out.println("任务 " + index + " 执行者: " + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (counter){
counter.addAndGet(1);
System.out.println("当前为: "+counter.get());
}
});
}
// 确保所有任务完成
ThreadPoolUtil. shutdown();
ThreadPoolUtil.threadPool. awaitTermination(1, TimeUnit.MINUTES);
System.out.println("所有任务完成" + counter.get());
}
}
工具类
java
package com.fd;
import java.util.concurrent.*;
public class ThreadPoolUtil {
private static final int CORE_POOL_SIZE = 4;
private static final int MAX_POOL_SIZE = 10;
private static final int QUEUE_CAPACITY = 100;
private static final Long KEEP_ALIVE_TIME = 1L;
public static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(QUEUE_CAPACITY),
new ThreadPoolExecutor.CallerRunsPolicy()
);
/**
* 提交一个 Runnable 任务到线程池执行
* @param task 要执行的任务
*/
public static void execute(Runnable task) {
threadPool.execute(task);
}
/**
* 关闭线程池
*/
public static void shutdown() {
threadPool.shutdown();
}
}