激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java手寫線程池的實現方法

Java手寫線程池的實現方法

2021-04-14 11:41愛吃鹽的猿 Java教程

這篇文章主要為大家詳細介紹了Java手寫線程池的實現方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java手寫線程池的實現代碼,供大家參考,具體內容如下

1.線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。

2.線程池簡易架構

Java手寫線程池的實現方法

3.簡易線程池代碼(自行優化)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.List;
 
/**
 * 線程接口
 *
 * @Author yjian
 * @Date 14:49 2017/10/14
 **/
public interface IThreadPool {
 //加入任務
 void execute(Runnable task);
 
 //加入任務
 void execute(Runnable[] tasks);
 
 //加入任務
 void execute(List<Runnable> tasks);
 
 //銷毀線程
 void destroy();
}

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
 
/**
 * 線程實現類(簡易實現,自行優化.提供思路)
 *
 * @Author yjian
 * @Date 14:49 2017/10/14
 **/
@SuppressWarnings("ALL")
public class ThreadPoolImpl implements IThreadPool {
 //默認開啟線程個數
 static int WORKER_NUMBER = 5;
 //完成任務線程數 可見性
 static volatile int sumCount = 0;
 //任務隊列 list非線程安全,可以優化為BlockingQueue
 static List<Runnable> taskQueue = new LinkedList<Runnable>();
 //線程工作組
 WorkerThread[] workThreads;
 //原子性
 static AtomicLong threadNum = new AtomicLong();
 
 static ThreadPoolImpl threadPool;
 
 //構造方法
 public ThreadPoolImpl() {
  this(WORKER_NUMBER);
 }
 
 public ThreadPoolImpl(int workerNum) {
  this.WORKER_NUMBER = workerNum;
  //開辟工作線程空間
  workThreads = new WorkerThread[WORKER_NUMBER];
  //開始創建工作線程
  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("初始化線程數" + (i + 1) + "---------當前線程名稱:" + thread.getName());
   thread.start();
  }
 }
 
 @Override
 public String toString() {
  return "工作線程數量為" + WORKER_NUMBER
    + "已完成的任務數" + sumCount +
    "等待任務數量" + taskQueue.size();
 }
 
 
 //獲取線程池
 public static IThreadPool getThreadPool() {
  return getThreadPool(WORKER_NUMBER);
 }
 
 public static IThreadPool getThreadPool(int workerNum) {
  //容錯性,如果小于等于0就默認線程數
  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() {
  //循環是否還存在任務,如果存在等待20毫秒處理時間
  while (!taskQueue.isEmpty()) {
   try {
    Thread.sleep(20);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  //如果任務隊列已處理完成,銷毀線程,清空任務
  for (int i = 0; i < WORKER_NUMBER; i++) {
   workThreads[i].setWorkerFlag();
   workThreads[i] = null;
  }
  threadPool = null;
  taskQueue.clear();
 }
 
 //創建工作線程池
 class WorkerThread extends Thread {
  //用來標識當前線程屬于活動可用狀態
  private boolean isRunning = true;
 
  @Override
  public void run() {
   Runnable runnable = null;
   //死循環
   while (isRunning) {
    //非線程安全,所以采用同步鎖
    synchronized (taskQueue) {
     while (isRunning && taskQueue.isEmpty()) {
      try {
       //如果任務隊列為空,等待20毫秒 監聽任務到達
       taskQueue.wait(20);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }
     //任務隊列不為空
     if (!taskQueue.isEmpty()) {
      runnable = taskQueue.remove(0);//獲取第一個任務
     }
    }
    if (runnable != null) {
     runnable.run();
    }
    sumCount++;
    runnable = null;
   }
  }
 
  //銷毀線程
  public void setWorkerFlag() {
   isRunning = false;
  }
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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());
  }
  //執行任務
  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() + " 執行任務" + (i++) + " 完成");
  }
 }
 
}

對spring源碼研究的,仔細查看代碼用了哪幾種spring常用的模式。寫程序的規范應該和spring一樣。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜视频在线 | 国产小视频在线观看 | 91在线播放国产 | 91 在线免费观看 | 久久亚洲网| 美女毛片在线观看 | 噜噜噜在线 | 欧美日韩亚洲国产精品 | 国产精品亚洲综合一区二区三区 | 免费观看国产精品视频 | 久久久看| 国产一及毛片 | 韩国精品视频在线观看 | av在线视 | 中文字幕在线观看网址 | 黄色大片在线免费观看 | 动漫孕妇被羞羞视频 | 欧美日韩在线看片 | 91天堂国产在线 | 99久久免费看精品国产一区 | 久久国产秒 | 在线a亚洲视频播放在线观看 | 久久亚洲线观看视频 | 日韩精品中文字幕在线观看 | 日日噜噜噜噜久久久精品毛片 | 91亚洲精品一区二区福利 | 久久精品操 | 国产一级片91 | 特黄一区二区三区 | 72pao成人国产永久免费视频 | 爱逼爱操综合网 | 日本黄色一级视频 | 中文字幕在线观看视频www | 国产精品久久在线观看 | 91美女福利视频 | 精品一区二区免费 | 久久精品国产99久久久古代 | 国产在线导航 | 综合网日日天干夜夜久久 | 欧美日韩亚洲成人 | 神马顶级推理片免费看 |