JavaEE初阶--多线程Thread基本用法

目录

一.简介

二.Thread的常见属性

三.Thread类的基本用法

3.1 线程的创建

3.2 线程的启动

3.3 线程的等待

3.4 线程的休眠

3.5 线程的中断

3.6 获取线程实例

四.总结


一.简介

  在之前的EE初阶文章中,我们为大家介绍了多线程创建的5种方法,这里再给大家回顾一下。

1.继承Thread  2.实现Runnable 3.匿名内部类  4.匿名内部类(实现Runnable) 5.lambda表达式(最常用的)。具体的代码实现可看:JavaEE初阶--进程与线程的区别与联系-CSDN博客

  本篇文章将继续给大家介绍Thread的其他基本用法

二.Thread的常见属性

  

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

ID是线程唯一标识,不同线程不会重复。

名称是各种调试工具用到。

状态表示线程当前所处的一个情况,接下来会给大家演示线程不同的状态。

优先级高的线程理论上来说更容易被调度到。

关于后台线程,JVM会在一个进程的所有非后台线程结束后,才会结束运行。

是否存货,run方法是否运行结束了。

线程的中断问题。

代码演示:

public class Demo {
    public static void main(String[] args) {
        Thread t1=new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    System.out.println(Thread.currentThread().getName()+"开始");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println(Thread.currentThread().getName()+"结束");
        });

        System.out.println(Thread.currentThread().getName() + t1.getId());          //获取ID
        System.out.println(Thread.currentThread().getName() + t1.getName());        //获取名字
        System.out.println(Thread.currentThread().getName() + t1.getState());       //获取状态
        System.out.println(Thread.currentThread().getName() + t1.getPriority());   //获取优先级
        System.out.println(Thread.currentThread().getName() + t1.isDaemon());       //查看后台线程
        System.out.println(Thread.currentThread().getName() + t1.isAlive());        //是否存活
        System.out.println(Thread.currentThread().getName() + t1.isInterrupted());  //是否被打断


        t1.start();
        while(t1.isAlive()){

        }
        System.out.println(Thread.currentThread().getName() + t1.getState());
    }
}

结果展示:

三.Thread类的基本用法

3.1 线程的创建

上文介绍过,此处不再重复。

3.2 线程的启动

t1.start();

调用start方法,才真的在操作系统的底层创建出一个线程。

3.3 线程的等待

有的时候,我们需要等待一个线程完成它的工作后,才能进行下一步工作,所以我们就需要一个方法来明确等待线程的结束。

这时我们就需要引入 join()方法

join()还存在着其他用法:

方法说明
join()等待线程结束
join(long millis)等待线程结束,最多等millis毫秒
join(long millis,int nanos)同上面,但具有更高的精度

3.4 线程的休眠

因为线程的调度是不可控的,所以,休眠方法只能保证休眠时间是大于等于参数设置的休眠时间的。

方法说明
public static void sleep(long millis) throws InterruptedException休眠当前线程
public static void sleep(long millis ,int nanos) throws InterruptedException拥有更高的精度

public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        System.out.println(System.currentTimeMillis());
        Thread.sleep(3000);
        System.out.println(System.currentTimeMillis());
    }
}

3.5 线程的中断

方法说明
public void interrupt()中断对象关联的线程,如果线程正在阻塞
public static boolean interrupted()判断当前线程的中断标志位是否设置
public boolean isInterrupted()判断对象关联的线程的标志位是否设置

thread受到通知的方式有两种:

1.如果线程因为调用wait/join/sleep等方法而阻塞挂起,则以InterruptedException异常的形式通知,清除中断标志。

2.否则,只是内部的一个中断标志被设置,thread可以通过Thread.currentThread().isInterrupted()判断指定线程的中断标志被设置,不清除中断标志这种方式通知收到的更及时,即使线程正在sleep也可以马上收到。   

3.6 获取线程实例

public class Demo3 {
    public static void main(String[] args) {
        Thread thread=Thread.currentThread();
        System.out.println(thread.getName());
    }
}

四.总结

  本篇文章为大家介绍了一下Thread的常见属性以及基本用法。欢迎各位在评论区讨论以及指出文章不足,感谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值