完整的Java线程池示例代码
下面是一个完整的Java线程池示例代码,包括线程池的创建、提交任务、获取任务执行结果、关闭线程池等操作:
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
// 提交任务
executor.submit(new Runnable() {
public void run() {
System.out.println("Task 1 is running in thread " + Thread.currentThread().getName());
}
});
Future<Integer> future = executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
System.out.println("Task 2 is running in thread " + Thread.currentThread().getName());
return 1 + 2;
}
});
// 获取任务执行结果
try {
Integer result = future.get();
System.out.println("Task 2 result is " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
// 关闭线程池
executor.shutdown();
}
}
上述代码创建了一个大小为5的固定线程池,然后向线程池提交了两个任务,一个是实现了Runnable接口的匿名类,另一个是实现了Callable接口的匿名类。接着使用Future接口获取了Callable任务的执行结果,并打印输出结果。最后关闭了线程池。
怎么等待线程都执行完
可以使用Java中的CountDownLatch类来等待线程都执行完毕。
CountDownLatch是一个同步工具类,它可以让某个线程等待直到倒计时结束,再开始执行。在创建CountDownLatch时,需要传入一个倒计时的计数器,调用CountDownLatch的countDown()方法可以将计数器减1,调用await()方法可以让当前线程等待,直到计数器变为0才会继续执行。
以下是一个示例代码,展示了如何使用CountDownLatch等待多个线程都执行完毕:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class WaitThreadExample {
public static void main(String[] args) {
int nThreads = 5;
CountDownLatch latch = new CountDownLatch(nThreads);
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
for (int i = 0; i < nThreads; i++) {
executor.submit(new Runnable() {
public void run() {
// 线程执行任务
System.out.println("Thread " + Thread.currentThread().getName() + " is running");
// 计数器减1
latch.countDown();
}
});
}
// 等待所有线程执行完毕
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭线程池
executor.shutdown();
System.out.println("All threads have finished executing");
}
}
上述代码创建了一个大小为5的固定线程池,并向线程池提交了5个任务。每个任务在执行完毕后,都会将计数器减1。最后使用CountDownLatch的await()方法等待计数器变为0,即所有任务都执行完毕。当计数器为0时,会输出"All threads have finished executing"。最后关闭了线程池。