线程常用api以及线程的状态


一、Thread常用api

Thread中有静态方法,实例方法

当前线程——某个执行语句(可能是thread的静态方法,实例方法,或其他的System.out.println普通方法)执行的时候所在的线程
线程引用的对象——thread对象.实例方法

1.activeCount()

返回当前线程处于活跃状态的线程数

活跃状态:线程创建以后,销毁之前,都是活跃状态

2.run()

定义线程需要执行的任务代码·

public static void main(String[] args) {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true){

            }
        }
    },"t1线程");
    //main线程调用thread对象的run方法(和普通方法调用没有啥区别):
    //main线程运行,t1是没有创建的
    t1.run();
}

在这里插入图片描述

3.start()

创建系统线程,并申请系统调度(转换为就绪态)

如果调度到了,进入运行态,才会执行run方法的任务代码

public static void main(String[] args) {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true){

            }
        }
    },"t1线程");
    t1.start();//main线程执行完start就结束了:t1运行,main结束
}

借助jdk的命令可以观察一个Java进程的信息(包括线程的信息):
在这里插入图片描述

展示结果:
在这里插入图片描述

public static void main(String[] args) {
   while(true){

   }
}

展示结果:
在这里插入图片描述

4.static Thread currentThread()

返回这行代码执行时的当前线程引用对象

5.getName()

返回线程的名称
可以通过new Thread时传入线程名称

6.static void sleep(long millis)

让当前线程休眠 millis(毫秒)

操作系统内部还有一个阻塞队列,线程休眠/阻塞,就是进入这个阻塞队列,等恢复(sleep就是等待一段时间),再拿出来重新执行

7.static void yield()

让当前线程让步(从运行态,转为就绪态)
在这里插入图片描述

8.isAlive()

判断线程引用对象是否是活跃状态

9.getPriority()(了解)

setPriority(int newPriority)
返回或设置某个线程的优先级(系统调度时,优先级只是一个指标,所以一般不以这个作为哪个线程先执行)

多个线程,是并发并行执行;如果要让某个线程先执行,一般不使用设置优先级的方式,而使用join、线程通信的方式

10.isDaemon()

setDaemon(boolean on)
设置某个线程为守护线程,true=设置为守护线程,false=设置为非守护线程
不调用=false

那么守护线程是什么呢?

用个比较通俗的比喻:任何一个守护线程都是整个JVM中所有非守护线程的保姆:

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务

public static void main(String[] args) {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true){

            }
        }
    });
    //t线程作为守护线程,整个Java进程就没有处于活跃状态的非守护线程了
    t.setDaemon(true);
    t.start();
}

11.中断一个线程

表示中断这个动作
自己实现中断线程的操作:设计一个标志位,表示是否被中断线程每次执行时,循环判断是否被中断了
在这里插入图片描述

boolean isTnterrupted():返回线程内置的中断标志位
void interrupt():表示中断这个动作
如果线程处于休眠/等待等状态,让线程中断,是以该线程对象抛异常的方式来中断
(此时会重置中断标志位为初始值false)
至于是否要中断,是线程内任务代码所决定

举例:
我正在玩游戏,我妈叫我去买菜(中断玩游戏过程)
我的反应:

  1. 好,然后继续玩游戏(中断但程序不管,忽略中断)
  2. 好,然后去买菜(中断)

中断一个线程,到底要不要中断,是由程序自己的逻辑(判断中断标志位,如果休眠/等待,抛异常进入catch语句,并重置中断标志位)决定
相当于捕获异常后的逻辑,决定是否中断

static boolean interrupted():返回当前线程的中断标志位,调用以后,就会重置标志位(了解)
一般来说,获取中断标志位,无脑的使用isInterrupted就行

12.join()

线程对象t.join(),当前线程加入t线程:当前线程在这行代码等待,等t线程执行完再执行后边的代码
线程之间是并发并行执行,如果想满足线程间的执行顺序,具体是等某个线程执行完,再执行另一个线程,可以使用join

void join(long millis):一般来说,一直等待某个线程执行完,是不太科学的;一般使用超时等待(最多等待xxx毫秒)
要么t线程执行完,要么时间到,当前线程就接着执行

二、线程的状态

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

RUNNABLE:包含就绪态和运行态(程序不知道到底线程是就绪还是运行,由系统决定)

线程状态转换图:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dhdhdhdhg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值