认识多线程:线程池的简单使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/woailuo23/article/details/97615737

线程池使用有点:  提供一个线程队列,队列中保存所有;

如下代码有两种方式:Runable 和 Callable

使用步骤:step1:创建一个线程池(5种)  step2:分配任务pool.submit(tpd) step3:关闭线程池 pool.shutdown();

package com.pccc.pactera.juc01;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 线程池: 提供一个线程队列,队列中保存所有等待状态的线程,避免了创建与销毁额外开销,提高了相应速度
 * 
 * 线程池的体系结构 java.util.concurrent.Executor :负责线程的使用与调度的根接口 --ExecutorService
 * 子接口:线程池的主要接口 --ThreadPoolExecutor 线程池的实现类 --ScheduledExecutorService
 * 子接口:负责线程调度 --ScheduledThreadPoolExecutor
 * 继承ThreadPoolExecutor,实现了ScheduledExecutorService 工具类 Executor
 * 
 * ScheduledExecutorService newScheduledThreadPool()创建固定大小的线程,可以延迟或定时的执行任务
 * 
 * @author zhao
 * 
 */
public class TestThreadPool {
	public static void main(String[] args) throws Exception {
		// 1创建一个线程池
		ExecutorService pool = Executors.newFixedThreadPool(5);

		// Callable的使用方式
		List<Future<Integer>> list = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			Future<Integer> future = pool.submit(new Callable<Integer>() {

				@Override
				public Integer call() throws Exception {
					int sum = 0;
					for (int i = 0; i < 100; i++) {
						sum += i;
					}
					return sum;
				}

			});
			list.add(future);
			// System.out.println(future.get());
		}

		pool.shutdown();

		for (Future<Integer> future : list) {// 获取结果
			System.out.println(future.get());
		}

		/*
		 * runable方式: ThreadPoolDemo tpd = new ThreadPoolDemo();
		 * 
		 * // 2为线程池中的线程分配任务 for (int i = 0; i < 10; i++) { pool.submit(tpd); }
		 * 
		 * // 3关闭线程池 pool.shutdown();// 平和的方式,会等待线程池的所有任务完成后再关闭,不接受新任务 //
		 * pool.shutdownNow();// 直接关闭,不关系是否有正在执行的线程任务
		 */
	}
}

class ThreadPoolDemo implements Runnable {
	private int i = 0;

	@Override
	public void run() {
		while (i <= 100) {
			System.out.println(Thread.currentThread().getName() + ": " + i++);
		}
	}

}

等待状态的线程,避免了创建与销毁额外开销,提高了相应速度

猜你喜欢

转载自blog.csdn.net/woailuo23/article/details/97615737
今日推荐