多线程学习总结(三)——实现多线程的方法之线程池

    声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333
    前面已经提到了三种实现多线程的方式,这三种都是最基础的(或者说是两种),这里要提到的其他实现方式,其实也只是都这三种方式的包装,
本质上还是原来的那些,只是包装成一个工具类让大家能够更方便的使用。
    这里我会把我知道的所有的方法给大家说下(如果有遗漏欢迎大家补充,有些本质一样的用法不一样的我这里也当做两个处理)。
    首先,是第一种通过线程池来实现多线程。线程池我的理解就是为了管理线程的,原先我们如果要启动10个任务(同样的任务)的话,
要通过new的方式十次,创建十个线程,来完成十个任务。有了线程池那就不一样了,我们可以只要一个(或者任意几个),
一个线程完成完成一个任务后,不会马上结束这个线程,而是放在线程池中,等待下一个任务的到来,然后执行。
    代码示例(不用线程池的情况)
public class TestThreadPool {
    public static void main(String[] args) {
        Thread t = null;
        for (int i = 0; i < 10; i++) {
            t = new Thread(new ThreadDemo1());
            t.start();
        }
    }
}

class ThreadDemo1 implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 重复任务在执行。。。。");
    }
}

控制台显示
Thread-0 重复任务在执行。。。。
Thread-1 重复任务在执行。。。。
Thread-2 重复任务在执行。。。。
Thread-5 重复任务在执行。。。。
Thread-3 重复任务在执行。。。。
Thread-8 重复任务在执行。。。。
Thread-6 重复任务在执行。。。。
Thread-9 重复任务在执行。。。。
Thread-7 重复任务在执行。。。。
Thread-4 重复任务在执行。。。。
从结果中可以看出这里是每个任务都是启动了一个线程。

    代码示例(使用线程池的情况)
public class TestThreadPool {
    public static void main(String[] args) {
        //创建只含有三个线程容量的线程池
        ExecutorService service = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            service.execute(new ThreadDemo1());
        }
    }
}

class ThreadDemo1 implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 重复任务在执行。。。。");
    }
}

控制台显示
pool-1-thread-1 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-2 重复任务在执行。。。。
pool-1-thread-1 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-2 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-1 重复任务在执行。。。。
pool-1-thread-3 重复任务在执行。。。。
pool-1-thread-2 重复任务在执行。。。。
从结果中可以看出,虽然在代码中new ThreadDemo1()循环了10次,可在线程池中实际上是三个线程交替运行的。
创建线程池还有其他三种类型,分别是:

 ExecutorService service = Executors.newCachedThreadPool();
ExecutorService service = Executors.newSingleThreadExecutor();
ExecutorService service = Executors.newScheduledThreadPool(3);
    具体的这四种线程池之间都有什么区别,大家可自己在网上查找资料,这里就不逐个说明了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值