一个做服装品牌的网站,福州专业网站建设公司,网站建设企业网站建设,服务网站建设排行什么是线程池#xff0c;这个池字是什么
线程池#xff0c;主要利用池化思想#xff0c;线程池#xff0c;字符串常量池等
为什么要有一个线程池#xff1f;
正常线程的创建#xff1a;1#xff0c;手动创建一个线程
2.给该线程分配任务#xff0c;线程执行任务
3…什么是线程池这个池字是什么
线程池主要利用池化思想线程池字符串常量池等
为什么要有一个线程池
正常线程的创建1手动创建一个线程
2.给该线程分配任务线程执行任务
3.执行完成手动释放线程
有了线程池后默认线程数为3最大线程数为5等待队列为6在正常状态下我们只有三个默认线程去处理任务流程是这样的
1.等待队列按照顺序分出任务给空闲线程直到任务为空或者无空闲线程
2.线程执行完任务后不会销毁而是继续执行任务如果此时没有任务那么线程进入空闲状态不会被销毁 如果任务变多等待队列满呢
此时只有三个线程但是任务队列已经满了证明在这个状态下只有三个线程工作是不够的所以我们开启最大线程数全部开始处理任务如果此时仍然想有任务进入队列拒绝。 在将任务处理完毕后队列处于空闲或者任务很少的状态销毁线程使当前的线程数为默认线程数 优点
提高线程利用率
提高响应速度省去创建线程的时间了
控制并发数控制最大线程数量)
便于统一管理(都位于线程池中)
代码实现
package org.my;import java.util.ArrayList;
import java.util.Collections;import java.util.LinkedList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicLong;import java.util.stream.Collectors;/*** 创建了num个线程* 每个线程做woker这个任务* 而woker这个任务是不断取jobs中的一个任务进行执行* 直到jobs为空然后进入等待状态* 如果jobs又重新exe添加了新job* jobs唤醒worker可以开始运行* 线程就可以继续开始工作。*/
public class ThreadPoolLearn313Job extends Runnable implements ThreadPoolJob {//最大线程数量private static final int MAX_WORKER_NUMBERS 10;//默认线程数private static final int DEFAULT_WORKER_NUMBERS 5;//最小线程数private static final int MIN_WORKER_NUMBERS 1;//任务队列private final LinkedListJob jobs new LinkedList();private final ListWorker workers Collections.synchronizedList(new ArrayListWorker());//AtomicLong可理解为加了synchronized的longprivate AtomicLong threadNum new AtomicLong();private int workerNum DEFAULT_WORKER_NUMBERS;public ThreadPoolLearn313() {initializeWorkers(DEFAULT_WORKER_NUMBERS);}private void initializeWorkers(int num) {for (int i 0; i num; i) {Worker worker new Worker();workers.add(worker);Thread thread new Thread(worker,ThreadPool-Worker-threadNum.incrementAndGet());thread.start();}}public ThreadPoolLearn313(int num) {this.workerNum numMAX_WORKER_NUMBERS?MAX_WORKER_NUMBERS:numMIN_WORKER_NUMBERS?MIN_WORKER_NUMBERS:num;initializeWorkers(workerNum);}Overridepublic void execute(Job job) {if (job!null){synchronized (jobs){jobs.addLast(job);jobs.notify();}}}//关闭线程池Overridepublic void shutdown() {for (Worker worker : workers) {worker.shutdown();}}Overridepublic void addWorks(int num) {synchronized (jobs){if(numworkerNumMAX_WORKER_NUMBERS){num MAX_WORKER_NUMBERS-workerNum;}initializeWorkers(num);workerNumnum;}}Overridepublic void removeWorks(int num) {synchronized (jobs){if(numworkerNum){throw new IllegalArgumentException(beyond workNum);}int count0;while (countnum){Worker worker workers.get(count);if(workers.remove(worker)){worker.shutdown();count;}}workerNum-count;}}Overridepublic int getJobSize() {return jobs.size();}class Worker implements Runnable{private volatile boolean running true;Overridepublic void run() {while (running){Job job null;synchronized (jobs){while (jobs.isEmpty()){try {jobs.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();return;}}job jobs.removeFirst();}if(job!null){job.run();}}}public void shutdown(){running false;}}
}