多线程(二):线程池和线程生命周期

本文介绍了Java中线程池的四种类型:可缓存线程池、定长线程池、定时及周期性任务执行的线程池和单线程池,并详细阐述了线程的生命周期,包括新建、就绪、运行、阻塞和死亡五个状态,帮助开发者更好地理解和使用线程。

学习内容:

1、 补充创建线程的方式
2、 线程的生命周期
3、 线程的常用方法


线程的创建

第四种创建线程的方法:线程池

Executors是提供着四种线程池

可缓存线程池

newCachedThreadPool

public class ThreadPoolDemo1 {

    public static void main(String[] args) {
        //newCachedThreadPool线程池会循环调用,线程池长度超过处理需要,可自己灵活回收空闲线程然后在调用,若没有可回收的线程在进行创建。
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 100; i++) {
            int num = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
                }
            });
        }

    }
}

定长线程池

newFixedThreadPool

public class ThreadPoolDemo2 {

    public static void main(String[] args) {
        //newFixedThreadPool线程池是点定义了最大的并发数量,超出的部分需要等待
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 10; i++) {
            int num = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                        System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
                }
            });
        }
    }
}

定长线程池,支持定时及周期性任务执行

newScheduledThreadPool

public class ThreadPoolDemo3 {

    public static void main(String[] args) {
        //定时线程池newScheduledThreadPool也可以定义控制线程最大的并发数量
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
        for (int i = 0; i < 10; i++) {
            int num = i;
            scheduledExecutorService.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
                }
                //前面的参数是填写的多少秒后开始执行线程,后面的是秒的时间单位,一般是毫秒这样设置后就是秒
            },5,TimeUnit.SECONDS);
        }
    }
}

单线程化的线程池

newSingleThreadExecutor

public class ThreadPoolDemo4 {

    public static void main(String[] args) {
    	//newSingleThreadExecutor只用一个工作线程可以完全按照顺序进行
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            int num = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
            System.out.println("threadName"+Thread.currentThread().getName()+",i="+num);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        executorService.shutdown();
    }
}

线程的生命周期

线程的生命周期分为五个状态

  1. 新建 NEW

  2. 准备/就绪 START

  3. 运行 RUNNING

  4. 阻塞 BLOCKING

  5. 死亡 DEAD

    下面放一个流程图让你们更好的去理解
    在这里插入图片描述

线程的常用方法

方法介绍
start()启动
stop()停止(禁用,可能导致线程死锁等问题),停止线程可以让run执行结束
String getName()获得线程的名字
setName(String)设置线程名字
sleep(long)进入睡眠,毫秒
setPriority(int)设置线程的优先级(1~10从低到高)越高抢CPU几率更高
setDaemon(boolean)设置为后台线程 true ,后台线程是为其它线程服务的,如果没有其它线程存在,就自动死亡;使用案例:GC就是一种后台线程
join()线程的加入(合并)让其它线程先执行完,再执行自己的指令
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值