Java手寫線程池的實現(xiàn)方法
本文實例為大家分享了Java手寫線程池的實現(xiàn)代碼,供大家參考,具體內(nèi)容如下
1.線程池是一種多線程處理形式,處理過程中將任務(wù)添加到隊列,然后在創(chuàng)建線程后自動啟動這些任務(wù)。線程池線程都是后臺線程。
2.線程池簡易架構(gòu)

3.簡易線程池代碼(自行優(yōu)化)
import java.util.List;
/**
* 線程接口
*
* @Author yjian
* @Date 14:49 2017/10/14
**/
public interface IThreadPool {
//加入任務(wù)
void execute(Runnable task);
//加入任務(wù)
void execute(Runnable[] tasks);
//加入任務(wù)
void execute(List<Runnable> tasks);
//銷毀線程
void destroy();
}
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
/**
* 線程實現(xiàn)類(簡易實現(xiàn),自行優(yōu)化.提供思路)
*
* @Author yjian
* @Date 14:49 2017/10/14
**/
@SuppressWarnings("ALL")
public class ThreadPoolImpl implements IThreadPool {
//默認開啟線程個數(shù)
static int WORKER_NUMBER = 5;
//完成任務(wù)線程數(shù) 可見性
static volatile int sumCount = 0;
//任務(wù)隊列 list非線程安全,可以優(yōu)化為BlockingQueue
static List<Runnable> taskQueue = new LinkedList<Runnable>();
//線程工作組
WorkerThread[] workThreads;
//原子性
static AtomicLong threadNum = new AtomicLong();
static ThreadPoolImpl threadPool;
//構(gòu)造方法
public ThreadPoolImpl() {
this(WORKER_NUMBER);
}
public ThreadPoolImpl(int workerNum) {
this.WORKER_NUMBER = workerNum;
//開辟工作線程空間
workThreads = new WorkerThread[WORKER_NUMBER];
//開始創(chuàng)建工作線程
for (int i = 0; i < WORKER_NUMBER; i++) {
workThreads[i] = new WorkerThread();
Thread thread = new Thread(workThreads[i], "ThreadPool-worker" + threadNum.incrementAndGet());
System.out.println("初始化線程數(shù)" + (i + 1) + "---------當前線程名稱:" + thread.getName());
thread.start();
}
}
@Override
public String toString() {
return "工作線程數(shù)量為" + WORKER_NUMBER
+ "已完成的任務(wù)數(shù)" + sumCount +
"等待任務(wù)數(shù)量" + taskQueue.size();
}
//獲取線程池
public static IThreadPool getThreadPool() {
return getThreadPool(WORKER_NUMBER);
}
public static IThreadPool getThreadPool(int workerNum) {
//容錯性,如果小于等于0就默認線程數(shù)
if (workerNum <= 0) {
workerNum = WORKER_NUMBER;
}
if (threadPool == null) {
threadPool = new ThreadPoolImpl(workerNum);
}
return threadPool;
}
@Override
public void execute(Runnable task) {
synchronized (taskQueue) {
taskQueue.add(task);
taskQueue.notifyAll();
}
}
@Override
public void execute(Runnable[] tasks) {
synchronized (taskQueue) {
for (Runnable task : tasks) {
taskQueue.add(task);
}
taskQueue.notifyAll();
}
}
@Override
public void execute(List<Runnable> tasks) {
synchronized (taskQueue) {
for (Runnable task : tasks) {
taskQueue.add(task);
}
taskQueue.notifyAll();
}
}
@Override
public void destroy() {
//循環(huán)是否還存在任務(wù),如果存在等待20毫秒處理時間
while (!taskQueue.isEmpty()) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果任務(wù)隊列已處理完成,銷毀線程,清空任務(wù)
for (int i = 0; i < WORKER_NUMBER; i++) {
workThreads[i].setWorkerFlag();
workThreads[i] = null;
}
threadPool = null;
taskQueue.clear();
}
//創(chuàng)建工作線程池
class WorkerThread extends Thread {
//用來標識當前線程屬于活動可用狀態(tài)
private boolean isRunning = true;
@Override
public void run() {
Runnable runnable = null;
//死循環(huán)
while (isRunning) {
//非線程安全,所以采用同步鎖
synchronized (taskQueue) {
while (isRunning && taskQueue.isEmpty()) {
try {
//如果任務(wù)隊列為空,等待20毫秒 監(jiān)聽任務(wù)到達
taskQueue.wait(20);
} catch (Exception e) {
e.printStackTrace();
}
}
//任務(wù)隊列不為空
if (!taskQueue.isEmpty()) {
runnable = taskQueue.remove(0);//獲取第一個任務(wù)
}
}
if (runnable != null) {
runnable.run();
}
sumCount++;
runnable = null;
}
}
//銷毀線程
public void setWorkerFlag() {
isRunning = false;
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* 測試類
*
* @Author yjian
* @Date 15:37 2017/10/14
**/
public class ThreadPoolTest {
public static void main(String[] args) {
//獲取線程池
IThreadPool t = ThreadPoolImpl.getThreadPool(20);
List<Runnable> taskList = new ArrayList<Runnable>();
for (int i = 0; i < 100; i++) {
taskList.add(new Task());
}
//執(zhí)行任務(wù)
t.execute(taskList);
System.out.println(t);
//銷毀線程
t.destroy();
System.out.println(t);
}
static class Task implements Runnable {
private static volatile int i = 1;
@Override
public void run() {
System.out.println("當前處理的線程:" + Thread.currentThread().getName() + " 執(zhí)行任務(wù)" + (i++) + " 完成");
}
}
}
對spring源碼研究的,仔細查看代碼用了哪幾種spring常用的模式。寫程序的規(guī)范應該和spring一樣。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用ExecutorService來停止線程服務(wù)
這篇文章主要介紹了Java使用ExecutorService來停止線程服務(wù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
java基于正則提取字符串中的數(shù)字功能【如提取短信中的驗證碼】
這篇文章主要介紹了java基于正則提取字符串中的數(shù)字功能,可用于提取短信中的驗證碼,涉及java基于正則的字符串匹配相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
SpringBoot中自定義注解實現(xiàn)參數(shù)非空校驗的示例
這篇文章主要介紹了SpringBoot中自定義注解實現(xiàn)參數(shù)非空校驗,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11
SpringBoot分布式文件存儲數(shù)據(jù)庫mongod
MongoDB是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫,由C++語言編寫,旨在為Web應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫中功能最豐富最像關(guān)系數(shù)據(jù)庫的2023-02-02

