手撕线程池

线程池是一个很重要的知识点,有时候面试官还会让手撕,所以这里就写了一个简单的线程池

参考:https://blog.csdn.net/hongtaolong/article/details/87808009

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
package com.CSDN;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;

public class MyThreadPoool {
private static final int WORK_NUM=100;
private static final int THREAD_NUM=5;
private int worknum;
private int threadnum;
private final Set<WorkThread> threadset;
private final ArrayBlockingQueue<Runnable> workqueue;

public MyThreadPoool(){
this(WORK_NUM,THREAD_NUM);
}

public MyThreadPoool(int worknum,int threadnum){
this.worknum=worknum;
this.threadnum=threadnum;
threadset=new HashSet<>();
workqueue=new ArrayBlockingQueue<Runnable>(worknum);
for (int i = 0; i < threadnum; i++) {
WorkThread w=new WorkThread("thead"+i);
w.start();
workqueue.add(w);
}
}

public void excute(Runnable r){
try{
workqueue.add(r);
}catch (Exception e){
e.printStackTrace();
}
}
public void shutdown(){
System.out.println("the ThreadPool is ready to shutdown");
if(threadset==null||threadset.isEmpty()){
return;
}
for(WorkThread w:threadset){
w.stopthread();
w=null;
}
threadset.clear();
}

public class WorkThread extends Thread{
public WorkThread(String name){
setName(name);
}
public void run(){
while(!interrupted()){
try{
Runnable runnable=workqueue.take();
if(runnable!=null){
System.out.println(getName()+"ready execute:"+runnable.toString());
runnable.run();
}
runnable=null;
}catch (Exception e){
interrupt();
e.printStackTrace();
}
}
}

public void stopthread(){
interrupt();
}
}
}