java手写简易线程池
原理:生成几个Runnable实例,放入list中,Runnable实例不断询问任务列表中是否还有任务。有任务取出执行,无任务进行等待任务出现
import java.util.ArrayList;
import java.util.List;
public class TestThread {
//创建一个任务列表 list
List list = new ArrayList<Runnable>();
//将任务加入到列表中,使用同步代码块锁住list列表,防止多线程操作线程不安全的ArrayLlist
public void execute(Runnable f) {
synchronized (list) {
list.add(f);
System.out.println("list" + list.size());
list.notifyAll();
}
}
public TestThread() {
for (int i = 0; i < 3; i++) {
WorkThreadsss workThreadsss = new WorkThreadsss(list);
new Thread(workThreadsss).start();
}
}
//测试
public static void main(String[] args) {
TestThread threadPoolTest01 = new TestThread();
//测试20000条任务
for (int i = 0; i < 20000; i++) {
int finalI = i;
threadPoolTest01.execute(() -> System.out.println("任务执行中"+ finalI + Thread.currentThread().getName()));
}
}
private class WorkThreadsss implements Runnable {
List list;
//初始化任务列表
public WorkThreadsss(List list) {
this.list = list;
}
@Override
public void run() {
System.out.println("运行中");
//持续运行,等待任务列表不为空
while (true) {
Runnable o = null;
synchronized (list) {
System.out.println(list.size());
//如果任务列表为空,进入等待
if (list.size() <= 0) {
// System.out.println("进入了" + Thread.currentThread().getId());
try {
list.wait(1000);
System.out.println(Thread.currentThread().getId()+"进程正在等待任务加入");
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
//如果任务列表为不为空,将任务分配给线程,移除任务
if (list.size() > 0) {
o = (Runnable) list.get(0);
System.out.println("开始执行");
list.remove(0);
}
}
}
//运行从列表获取的任务
if (o != null) {
o.run();
}
}
}
}
}

1540

被折叠的 条评论
为什么被折叠?



