彩票網(wǎng)站怎么做的營(yíng)銷模式
什么是線程池,這個(gè)池字是什么
線程池,主要利用池化思想,線程池,字符串常量池等
為什么要有一個(gè)線程池?
正常線程的創(chuàng)建:1,手動(dòng)創(chuàng)建一個(gè)線程
2.給該線程分配任務(wù),線程執(zhí)行任務(wù)
3.執(zhí)行完成,手動(dòng)釋放線程
有了線程池后,默認(rèn)線程數(shù)為3,最大線程數(shù)為5,等待隊(duì)列為6,在正常狀態(tài)下,我們只有三個(gè)默認(rèn)線程去處理任務(wù),流程是這樣的:
1.等待隊(duì)列按照順序分出任務(wù)給空閑線程,直到任務(wù)為空或者無(wú)空閑線程
2.線程執(zhí)行完任務(wù)后不會(huì)銷毀,而是繼續(xù)執(zhí)行任務(wù),如果此時(shí)沒(méi)有任務(wù),那么線程進(jìn)入空閑狀態(tài),不會(huì)被銷毀
如果任務(wù)變多,等待隊(duì)列滿呢
此時(shí)只有三個(gè)線程,但是任務(wù)隊(duì)列已經(jīng)滿了,證明在這個(gè)狀態(tài)下只有三個(gè)線程工作是不夠的,所以我們開(kāi)啟最大線程數(shù),全部開(kāi)始處理任務(wù),如果此時(shí)仍然想有任務(wù)進(jìn)入隊(duì)列,拒絕。
在將任務(wù)處理完畢后,隊(duì)列處于空閑或者任務(wù)很少的狀態(tài),銷毀線程,使當(dāng)前的線程數(shù)為默認(rèn)線程數(shù)
優(yōu)點(diǎn):
提高線程利用率
提高響應(yīng)速度(省去創(chuàng)建線程的時(shí)間了)
控制并發(fā)數(shù)(控制最大線程數(shù)量)
便于統(tǒng)一管理(都位于線程池中)
代碼實(shí)現(xiàn):
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;/*** 創(chuàng)建了num個(gè)線程* 每個(gè)線程做woker這個(gè)任務(wù)* 而woker這個(gè)任務(wù)是不斷取jobs中的一個(gè)任務(wù)進(jìn)行執(zhí)行* 直到j(luò)obs為空,然后進(jìn)入等待狀態(tài)* 如果jobs又重新exe添加了新job* jobs喚醒worker可以開(kāi)始運(yùn)行* 線程就可以繼續(xù)開(kāi)始工作。*/
public class ThreadPoolLearn313<Job extends Runnable> implements ThreadPool<Job> {//最大線程數(shù)量private static final int MAX_WORKER_NUMBERS = 10;//默認(rèn)線程數(shù)private static final int DEFAULT_WORKER_NUMBERS = 5;//最小線程數(shù)private static final int MIN_WORKER_NUMBERS = 1;//任務(wù)隊(duì)列private final LinkedList<Job> jobs =new LinkedList<>();private final List<Worker> workers = Collections.synchronizedList(new ArrayList<Worker>());//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 = num>MAX_WORKER_NUMBERS?MAX_WORKER_NUMBERS:num<MIN_WORKER_NUMBERS?MIN_WORKER_NUMBERS:num;initializeWorkers(workerNum);}@Overridepublic void execute(Job job) {if (job!=null){synchronized (jobs){jobs.addLast(job);jobs.notify();}}}//關(guān)閉線程池@Overridepublic void shutdown() {for (Worker worker : workers) {worker.shutdown();}}@Overridepublic void addWorks(int num) {synchronized (jobs){if(num+workerNum>MAX_WORKER_NUMBERS){num =MAX_WORKER_NUMBERS-workerNum;}initializeWorkers(num);workerNum+=num;}}@Overridepublic void removeWorks(int num) {synchronized (jobs){if(num>=workerNum){throw new IllegalArgumentException("beyond workNum");}int count=0;while (count<num){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;}}
}