当前位置: 代码迷 >> 综合 >> java 线程池 ThreadPoolExecutor 的简单示例
  详细解决方案

java 线程池 ThreadPoolExecutor 的简单示例

热度:41   发布时间:2023-12-18 11:41:05.0
  • 线程的实现方式

    • java 多线程之 extends Thread

    • java 多线程之 implements Runnable

    • java 多线程之 implements Callable

  • 线程池的使用

    • 线程池简介

    • ThreadPoolExecutor

      • java 线程池之 newScheduledThreadPool

      • java 线程池之 newCachedThreadPool

      • java 线程池之 newFixedThreadPool

      • java 线程池之 newSingleThreadExecutor

    • ForkJoinPool

      • java 线程池之 newWorkStealingPool

java  线程池 ThreadPoolExecutor 的UML类图:

简单示例:

public class ThreadPoolTest {// 线程final static int corePoolSize = 5;// 最大线程数final static int maximumPoolSize = 10;// 空闲存活时间final static long keepAliveTime = 0;// 存活时间的单位final static TimeUnit unit = TimeUnit.SECONDS;// 线程数final static int threads = 20;// 计数器,用于等待子线程执行完毕CountDownLatch countDownLatch = new CountDownLatch(threads);// 线程池的阻塞队列 LinkedBlockingQueue、SynchronousQueue、ArrayBlockingQueue、LinkedTransferQueue、PriorityBlockingQueueLinkedBlockingQueue<Runnable> linkedBlockingQueue = new LinkedBlockingQueue();/*** 线程池测试 execute** @throws InterruptedException InterruptedException*/@Testpublic void threadPoolTest1() throws InterruptedException {System.out.println("-------- begin ----------");ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, unit,linkedBlockingQueue);for (int i = 0; i < threads; i++) {final int finalI = i;threadPoolExecutor.execute(() -> {try {printThreadInfo(threadPoolExecutor, finalI);} catch (Exception e) {System.out.println(e);} finally {countDownLatch.countDown();}});}countDownLatch.await();System.out.println("-------- end ----------");}/*** 线程池测试 submit runnable** @throws InterruptedException InterruptedException*/@Testpublic void threadPoolTest2() throws InterruptedException {System.out.println("-------- begin ----------");ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, unit,linkedBlockingQueue);for (int i = 0; i < threads; i++) {final int finalI = i;threadPoolRunnable runnable = new threadPoolRunnable(threadPoolExecutor, finalI);Future<?> submit = threadPoolExecutor.submit(new Thread(runnable));// 这个会等待执行结果
//            Object o = submit.get();
//            System.out.println(o);}countDownLatch.await();System.out.println("-------- end ----------");}/*** 线程池测试 submit callable** @throws InterruptedException* @throws ExecutionException*/@Testpublic void threadPoolTest3() throws InterruptedException, ExecutionException {System.out.println("-------- begin ----------");ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, unit,linkedBlockingQueue);for (int i = 0; i < threads; i++) {final int finalI = i;threadPoolCallable callable = new threadPoolCallable(threadPoolExecutor, finalI);FutureTask<String> futureTask = new FutureTask<>(callable);Future<?> submit = threadPoolExecutor.submit(new Thread(futureTask));// 这个会等待执行结果Object o = futureTask.get();System.out.println(o);}
//        countDownLatch.await();System.out.println("-------- end ----------");}/*** Runnable 内部类*/private class threadPoolRunnable implements Runnable {ThreadPoolExecutor threadPoolExecutor;int finalI;/*** 构造函数** @param threadPoolExecutor 线程池* @param finalI             i*/public threadPoolRunnable(ThreadPoolExecutor threadPoolExecutor, int finalI) {this.threadPoolExecutor = threadPoolExecutor;this.finalI = finalI;}/*** run*/@Overridepublic void run() {try {printThreadInfo(threadPoolExecutor, finalI);} catch (Exception e) {System.out.println(e);} finally {countDownLatch.countDown();}}}/*** Callable 内部类*/private class threadPoolCallable implements Callable<String> {ThreadPoolExecutor threadPoolExecutor;int finalI;/*** 构造函数** @param threadPoolExecutor 线程池* @param finalI             i*/public threadPoolCallable(ThreadPoolExecutor threadPoolExecutor, int finalI) {this.threadPoolExecutor = threadPoolExecutor;this.finalI = finalI;}/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/@Overridepublic String call() {try {printThreadInfo(threadPoolExecutor, finalI);} catch (Exception e) {System.out.println(e);} finally {countDownLatch.countDown();}return Thread.currentThread().getName();}}/*** 打印线程池相关信息** @param threadPoolExecutor 执行器* @param finalI             i*/private void printThreadInfo(ThreadPoolExecutor threadPoolExecutor, int finalI) {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append("\r\n");stringBuffer.append("threadName=" + Thread.currentThread().getName());stringBuffer.append("\r\n");stringBuffer.append("finalI=" + finalI);stringBuffer.append("\r\n");stringBuffer.append("countDownLatch=" + countDownLatch.getCount());stringBuffer.append("\r\n");stringBuffer.append("getCorePoolSize=" + threadPoolExecutor.getCorePoolSize());stringBuffer.append("\r\n");stringBuffer.append("getPoolSize=" + threadPoolExecutor.getPoolSize());stringBuffer.append("\r\n");stringBuffer.append("getQueue=" + threadPoolExecutor.getQueue().size());stringBuffer.append("\r\n");stringBuffer.append("getLargestPoolSize=" + threadPoolExecutor.getLargestPoolSize());stringBuffer.append("\r\n");stringBuffer.append("getMaximumPoolSize=" + threadPoolExecutor.getMaximumPoolSize());stringBuffer.append("\r\n");stringBuffer.append("getTaskCount=" + threadPoolExecutor.getTaskCount());stringBuffer.append("\r\n");stringBuffer.append("getThreadFactory=" + threadPoolExecutor.getThreadFactory().getClass().getSimpleName());stringBuffer.append("\r\n");stringBuffer.append("getRejectedExecutionHandler=" + threadPoolExecutor.getRejectedExecutionHandler().getClass().getSimpleName());stringBuffer.append("\r\n");System.out.println(stringBuffer.toString());}
}
  相关解决方案