栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

线程的概念以及实际操作
  • 学习内容:
  • 线程的创建
    • 第四种创建线程的方法:线程池
      • 可缓存线程池
      • 定长线程池
      • 定长线程池,支持定时及周期性任务执行
      • 单线程化的线程池
  • 线程的生命周期
  • 线程的常用方法

学习内容:

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()线程的加入(合并)让其它线程先执行完,再执行自己的指令
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644312.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号