线程的创建和使用(二)

这篇具有很好参考价值的文章主要介绍了线程的创建和使用(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、线程的类和方法

Thread类是JVM用来管理线程的一个类,换句话说,每个线程都有唯一一个的Thread对象与之关联。

1.1、Thread的常见方法

方法 说明
Thread() 创建线程对象
Thread(Runnable target) 使用Runnable对象创建线程对象
Thread(String name) 创建线程对象并命名
Thread(Runnable target,String name) 使用Runnable对象创建线程对象,并命名
【不常用】Thread (ThreadGroup group,Runnable target) 线程可以用来分组管理,分好的组即为线程组

Thread t1=new Thread();

Thread t2=new Thread(new MyRunnable());

Thread t3=new Thread("线程的名字");

Thread t4=new Thread(new MyRunnable(),"线程的名字");

 1.2、Thread的几个常见属性

属性 获取方法
ID getId()
名称 getName()
状态 getState()
优先级 getPriority()
是否后台线程 isDaemon()
是否存活 isAlive()
是否被中断 isInterrupted()

Thread类是JAVA中的类,我们通过java代码创建Thread对象是java中的对象,调用start方法后,通过JVM去申请操作系统中的线程PCB,线程的对象是与PCB是一一对应的关系,但是他们的生命周期是不同的。

线程的创建和使用(二)

2、示例

2.1、后台线程的演示


public class Exe_02 {
    public static void main(String[] args) {
        //创建一个线程
        Thread thread=new Thread(()->{
            while(true){
                System.out.println("你干嘛,哎呦");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        //设置成后台线程
        thread.setDaemon(true);
        //启动线程
        thread.start();
        //查看线程是否存活
        System.out.println("是否存活"+thread.isAlive());
        System.out.println("main方法执行完成");
    }
}

设置为后台线程时,mian方法执行完成之后,,整个线程就退出了

线程的创建和使用(二)

1、线程在创建的时候,默认是一个前台线程

2、前台线程是可以组织线程退出的

3、后台线程不阻止影响进程的退出

2.2、线程是否存活


/**
 * 演示线程是否存活
 */
public class Exe_03 {
    public static void main(String[] args) throws InterruptedException {
        //创建线程
        Thread thread=new Thread(()->{
           int count=0;
           while(true) {
               System.out.println("小黑子" + count++);
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               //运行五次退出
               if(count>=5){
                   break;
               }
           }
        });
        //启动之前查看是否存活
        System.out.println("启动之前是否存活->"+thread.isAlive());
        //启动线程
        thread.start();
        //等待一秒让系统创建线程,确保线程创建完成开始执行
        Thread.sleep(1000);
        System.out.println("启动之后是否存活"+thread.isAlive());
        //等待线程执行完成
        thread.join();
        System.out.println("线程执行完成是否存活"+thread.isAlive());
    }
}

线程的创建和使用(二)

 2.3、线程的各个属性


/**
 * 线程的属性
 */
public class Exe_04 {
    public static void main(String[] args) {
        Thread thread=new Thread(()->{
            while(true){
                System.out.println("hello,iKun");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"鸽鸽");
        //启动线程
        thread.start();
        System.out.println("线程id="+thread.getId());
        System.out.println("线程名="+thread.getName());
        System.out.println("进程状态="+thread.getState());
        System.out.println("进程优先级="+thread.getPriority());
        System.out.println("线程是否后台="+thread.isDaemon());
        System.out.println("线程是否存活="+thread.isAlive());
        System.out.println("线程是否中断="+thread.isInterrupted());
    }
}

线程的创建和使用(二)

 2.4、start()和run()方法的区别

分别调用这两个方法的现象?

start()方法:它调用系统API,去申请一个系统层面的PCB,也就是说真正的申请系统的线程。

run()方法:是在描述线程中具体要执行的任务。

*单独调用run方法,只是对一个普通的java对象的普通方法调用而已,跟String的equals()方法一样,它并没有真正的去启动一个线程。

/*
start()方法是真正意义上调用系统API,申请系统层面的PCB,申请了系统创建线程的资源,真正创建了线程,可以进行多线程的调用
run()描述了线程任务,并不能进行多线程的调用,就跟普通的方法是一样的
 */
public class Exe_05 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
           while(true){
               System.out.println("只因坤坤爱坤坤");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        });
        thread.start();
        //调用run方法
        thread.run();
        //主线程打印一句话
        while(true){
            System.out.println("main");
            Thread.sleep(1000);
        }
    }
}

线程的创建和使用(二)

 2.5、线程中断

线程执行一半的时候需要停下来,提前结束。

目前常见的有以下两种方式:
1. 通过共享的标记来进行沟通
2. 通过thread调用 interrupted() 方法来通知

方式一:


/**
 * 通过标志位完成线程中断
 */
public class Exe_06 {
    //设置标志符
    private static Boolean isQuit=false;
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(() ->{
            //每次执行都要判断是否中断标志位
            while(!isQuit){
                System.out.println("再多一眼看一眼就会爆炸");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程执行完成");
        });
        System.out.println("线程启动前的状态="+thread.getState());
        System.out.println("线程启动前是否存活="+thread.isAlive());
        //启动线程
        thread.start();
        System.out.println("线程启动后的状态="+thread.getState());
        System.out.println("线程启动后是否存活="+thread.isAlive());
        //等待5秒
        Thread.sleep(4000);
        //修改标志位
        isQuit=true;
        Thread.sleep(4000);
        System.out.println("线程中断之后的状态="+thread.getState());
        System.out.println("线程中断之后是否存活="+thread.isAlive());
    }
}

线程的创建和使用(二)

 方式二:


public class Exe_07 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(() ->{
            //判断当前线程内部维护的中断标识
            while(Thread.currentThread().isInterrupted()){
                System.out.println("练习时长两年半");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    //中断唤醒线程睡眠状态,会抛出异常
                    //处理中断逻辑
                    //方式一;什么也不干,不去理会
                    //方式二:一会处理
                    //方式三:真正的中断操作
                    break;
                }
            }
            System.out.println("线程执行完成");
        });
        //启动线程
        thread.start();
        System.out.println("启动之前线程状态"+thread.getState());
        System.out.println("启动之前是否存活"+thread.isAlive());
        //先让这个线程执行一会
        Thread.sleep(3000);
        //中断线程
        thread.isInterrupted();//调用本地方法让PCB完成中断
        //等待线程销毁
        Thread.sleep(3000);
        System.out.println("中断之后线程状态"+thread.getState());
        System.out.println("中断之后是否存活"+thread.isAlive());
    }
}

线程的创建和使用(二)

调用Interrupted()方法后,会有两种情况注意:

1、线程正在RUNNABLE状态,那么不抛出异常,会直接中断。

2、线程在TIMED_WAITING状态,这时线程被唤醒配置并抛出异常,那么处理逻辑就要以catch语句块进行处理

3、处理中断能否正确执行,有两个地方需要判断,一个式while循环条件,处理情况1,异常中处理情况2。

2.6、线程等待


public class Exe_08 {
    public static void main(String[] args) {
        //创建线程
        Thread thread=new Thread(() ->{
            for (int i = 0; i < 5; i++) {
                System.out.println("hello,thread!!!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程执行完成!");
        });
        //启动线程
        thread.start();
        System.out.println("join之前线程状态" + thread.getState());
        System.out.println("join之前是否存活" + thread.isAlive());
        //使用join等待thread线程结束
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("join之后线程状态" + thread.getState());
        System.out.println("join之后是否存活" + thread.isAlive());
        System.out.println("主线程执行完成!!");
    }
}

线程的创建和使用(二)

 2.7、休眠当前线程

线程的创建和使用(二)

 2.8、获取当前线程

方法 说明
public static Thread currentThread(); 返回当前线程对象的引用

3、线程的状态

线程的状态是一个枚举类型 Thread.State

*NEW: 安排了工作, 还未开始行动
*RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
*BLOCKED: 这几个都表示排队等着其他事情
*WAITING: 这几个都表示排队等着其他事情
*TIMED_WAITING: 这几个都表示排队等着其他事情
*TERMINATED: 工作完成了.

线程的创建和使用(二)

线程的创建和使用(二) 

 文章来源地址https://www.toymoban.com/news/detail-491034.html

到了这里,关于线程的创建和使用(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA深化篇_29—— 线程使用之线程联合以及Thread类中的其他常用方法【附有详细说明及代码案例】

    线程联合 当前线程邀请调用方法的线程优先执行,在调用方法的线程执行结束之前,当前线程不能再次执行。线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。 join方法的使用 join()方法就是指调用该

    2024年02月05日
    浏览(44)
  • 【STM32&RT-Thread零基础入门】 5. 线程创建应用(线程创建、删除、初始化、脱离、启动、睡眠)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 本章主要讲线程的工作机制和管理方法,通过实例讲解如何使用多线程完成多任务开发。 RT-Thread用线程控制块来描述和管理一个线程,一个线程对应一个线程控制块。线程控

    2024年02月12日
    浏览(53)
  • 【STM32&RT-Thread零基础入门】 7. 线程创建应用(多线程运行机制)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 本章进一步研究多线程的运行机制。要求实现功能如下:创建2个线程,线程名称分别为LED和BEEP。两个线程的任务是连续5次打印本线程的名字后退出线程(注意:线程不执行

    2024年02月03日
    浏览(35)
  • 【STM32&RT-Thread零基础入门】 6. 线程创建应用(线程挂起与恢复)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 在上一个任务中,通过停止命令把线程删除后,线程在系统中就不存在了,也无法再使线程重新运行。例如输入stop_led_thread命令后,led停止闪烁,但也无法重新开启LED灯闪烁

    2024年02月11日
    浏览(34)
  • 【多线程初阶】Thread类常见方法以及线程的状态

    本文是属于多线程初阶内容系列的, 如果还没有学习过之前文章的, 请先移步博主的之前的文章进行学习, 本文就是在学会线程的创建后, 再带大家认识一下 Thread 类以及其常见的方法, 再给大家讲解一下线程都有哪些状态. 关注收藏, 开始学习吧🧐 通过我们上篇文章的学习, 我

    2024年02月16日
    浏览(37)
  • 【多线程】认识Thread类及其常用方法

    📄 前言 : 本文是对以往多线程学习中 Thread类 的介绍,以及对其中的部分细节问题进行总结。 之前的文章介绍过线程的引入能够更好地处理程序的并发执行问题。在Java中,线程的创建方式之一是通过 Thead类 (Thead封装了操作系统提供的API,使我们创建的线程能够系统的调

    2024年01月18日
    浏览(38)
  • 如何判断一个类是线程安全的

    一个类或者程序提供的接口,多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是 不必考虑同步问题 。 或者说一段代码可能会被多个线程同时执行,如果每次运行的结果和单线程执行的结果是一样的,并且其他变量的值也和预期的值是一样的,就是线程安全

    2024年02月08日
    浏览(42)
  • 【JavaEE多线程】Thread类及其常见方法(上)

    🌈 座右铭 🌈 :人的一生这么长、你凭什么用短短的几年去衡量自己的一生! 💕个人主页: 清灵白羽 漾情天殇_计算机底层原理,深度解析C++,自顶向下看Java-CSDN博客 ❤️ 相关文章 ❤️:清灵白羽 漾情天殇-CSDN博客 目录 系列文章目录 前言 一、Thread构造方法         1、Th

    2024年04月22日
    浏览(30)
  • 【JavaEE】_多线程Thread类及其常用方法

    目录 1. Thread类常用构造方法 2. Thread类的几个常见属性 3. 启动一个线程 4. 中断一个线程 4.1 方法1:手动设置标志位 4.2 方法2:使用Thread内置的标志位 5. 等待一个线程 6. 获取当前线程引用 7. 休眠当前线程 方法 说明 Thread() 创建线程对象 Thread(Runnable target) 使用Runnable对象创建

    2024年02月20日
    浏览(37)
  • 【JAVA】哪些集合类是线程安全的

    🍎 个人博客: 个人主页 🏆 个人专栏: JAVA ⛳️   功不唐捐,玉汝于成 目录 前言 正文 Vector: HashTable: Collections.synchronizedList()、Collections.synchronizedSet()、Collections.synchronizedMap(): 4.ConcurrentHashMap: 5.CopyOnWriteArrayList 和 CopyOnWriteArraySet: 结语  我的其他博客 在多线程编程中

    2024年01月25日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包