声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333
前面的关于线程安全的介绍,就暂时告一段落了,关于线程安全还有很多其他的要学习的地方,我水平有限,大家自己深入研究(学习永远要靠自己)。
今天来说说怎么构建一个线程池,来实现像java中已经实现的线程池类似的功能,当然我们只是简单实现,java中已经实现的肯定逻辑更严谨。
public class TestMyThreadPool {
public static void main(String[] args) {
MyThreadPool pool = new MyThreadPool(3);
TestThreadDemo t1 = new TestThreadDemo();
TestThreadDemo t2 = new TestThreadDemo();
TestThreadDemo t3 = new TestThreadDemo();
TestThreadDemo t4 = new TestThreadDemo();
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
}
}
class TestThreadDemo implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 正在运行中。。。,时间是 :" + new Date());
try {
//该线程睡两秒
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThreadPool {
private Worker[] workerArray;
private LinkedList<Runnable> workQueue = new LinkedList<Runnable>();
public MyThreadPool(int poolSize) {
//根据构造方法传入的线程池大小,构造相应数量的线程池,并启动
workerArray = new Worker[poolSize];
for (int i = 0; i < poolSize; i++) {
workerArray[i] = new Worker();
Thread t = new Thread(workerArray[i]);
t.start();
}
}
public void execute(Runnable r) {
synchronized (workQueue) {
workQueue.addLast(r);
workQueue.notify();
}
}
private class Worker implements Runnable {
@Override
public void run() {
Runnable r;
while (true) {
synchronized (workQueue) {
while (workQueue.isEmpty()) {
try {
//如果队列中没有妖运行的线程,线程阻塞
workQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//从队列中移除第一个
r = workQueue.removeFirst();
}
//这里调用的是run方法,不是start方法,意味着将存入的线程通过方法调用,而不是线程start
r.run();
}
}
}
}
运行结果
Thread-1 正在运行中。。。,时间是 :Sun Oct 23 12:33:45 CST 2016
Thread-2 正在运行中。。。,时间是 :Sun Oct 23 12:33:45 CST 2016
Thread-0 正在运行中。。。,时间是 :Sun Oct 23 12:33:45 CST 2016
Thread-1 正在运行中。。。,时间是 :Sun Oct 23 12:33:47 CST 2016
从结果中很明显可以看出虽然一次提交了四个线程,可是同一时刻只有三个在执行,另一个是等到三个钟有一个运行好了,才去执行的。
通过自己构造线程池的方式,能使得我们对线程池的原理理解的更深刻一些,上述代码中,关键的地方我都有加注释了,如果还有问题,可加群和我联系
当然,这个构建的线程池只是最最简单的线程池,实际java中已经存在的线程池,比这个复杂很多,功能也强大了许多。
到这里,多线程学习总结基本要算是结束了,这里面提到的都是一些简单入门知识,没有深入。对我来说学习一门技术就像使用工具,一开始,
不用急着知道工具是怎么知道的,也没必要要求自己一来就要造工具,先学会用,你使用了很熟练的,你才能发现这个工具的不足之处,
带着你的发现,去研究原理,更甚至于构造新的符合你要求的工具(个人见解,仅供参考)。学习是个永远在路上的过程,只有不放弃,才能继续往前,且行且努力,加油!!!