多线程学习总结(十二)——构建简单的线程池

    声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我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中已经存在的线程池,比这个复杂很多,功能也强大了许多。
到这里,多线程学习总结基本要算是结束了,这里面提到的都是一些简单入门知识,没有深入。对我来说学习一门技术就像使用工具,一开始,
不用急着知道工具是怎么知道的,也没必要要求自己一来就要造工具,先学会用,你使用了很熟练的,你才能发现这个工具的不足之处,
带着你的发现,去研究原理,更甚至于构造新的符合你要求的工具(个人见解,仅供参考)。学习是个永远在路上的过程,只有不放弃,才能继续往前,且行且努力,加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值