多线程学习(一)

java学习痛点难点就是多线程,同时很多公司面试时也要求精通多线程。为了克服这个难点,我写下学习多线程的所有遇到的值得记录的知识点。
先来一个线程测试类:


public class LiftOff implements Runnable {
    private int countDown = 100;
    private static int taskCount = 0;
    private final int id = taskCount++;

    public String status() {
        return "#" + id + "(" + (countDown > 0 ? countDown : "lift off") + ")";
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (countDown-- > 0) {
            System.out.println(status());
            Thread.yield();
        }
    }

    public static void main(String[] args) {
        // 线程不安全的
        // 线程执行方案一
        // 客户端直接执行任务
        // LiftOff l=new LiftOff();
        // for(int i=0;i<5;i++){
        // new Thread(l).start();
        // }
        // 线程执行方案二
        // 使用jdk5之后的 Executor来管理和执行线程
        ExecutorService service = Executors.newCachedThreadPool();// 命令设计模式
        LiftOff l = new LiftOff();
        for (int j = 0; j < 5; j++) {
            service.execute(l);
        }
        service.shutdown();
        //非常常见的情况是,单个Executor被用来创建和管理系统所有的任务
        //对shutdown方法的调用可以防止新的任务被提交给executor,当前线程将继续运行再shutdown调用之前提交的任务,并且这个程序在executor中所有的任务运行结束之后尽快退出
        //Executor允许管理异步线程的执行,无需显示管理线程的生命周期,Executor是javaSE5/6启动线程的优选方法。
    }
}

CachedThreadPool、FixedThreadPool、SingleThreadExecutor 的区别
FixedThreadPool一次性预见性的线程分配,因此也限制了线程的数量。这个可以节省创建线程的开销
SingleThreadExecutor 线程数量为一的FixedThreadPool 如果想singleThreadExecutor中提供了多个任务。
这些任务会排队,所有任务使用同一个线程,singleThreadExecutor会序列化所有提交给他的任务,并维护在它的隐藏的悬挂任务队列
cachedThreadPool 在程序执行过程中,通常会创建与所需线程数量相同的线程数,然后在它回收旧线程时停止创建新的线程。因此它是合适的Executor的首先,只有当这种方式出现问题了,才需要切换到FixedThreadPool

转载于:https://www.cnblogs.com/joeCqupt/p/6813665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值