服务器之家:专注于服务器技术及软件下载分享
分类导航

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一样。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

延伸 · 阅读

精彩推荐