最简单的多线程间状态转换关系多线程及常用方法

在上次学会了多线程启动方式后初识多线程:多线程的三种启动方式,今天我们来看看多线程中有哪些常用的方法,以及多线程状态间是如何转换的。

1. 常用方法

1.1 线程命名与取得
Ⅰ. 通过构造方法在创建线程时设置线程名称
     public Thread(String name)
     public Thread(Runnable target,String name)
Ⅱ. 线程名的取得
     public final String getName()
Ⅲ. 线程名的设置
     public final synchronized void setName(String name)
我们看看具体使用:

class myThread extends Thread {
    @Override
    public void run() { }
}
public class thread_method {
    public static void main(String[] args) {
        Thread thread = new Thread();
        System.out.println(thread.getName()); // Thread-0
        thread.setName("线程A");
        System.out.println(thread.getName()); // 线程A
        // 构造方法设置线程名
        Thread thread1 = new Thread("线程2");
        System.out.println(thread1.getName()); // 线程2
        thread.start();
        thread1.start();
    }
}

在我们不命名时,线程名默认为Thread-数字
1.2 线程设置优先级
线程优先级是指线程可能的执行顺序,仅仅是可能。线程优先级高的不一定先执行,我们只是给系统提了个建议,具体先执行哪个,还是由系统决定的。
设置优先级

public final void setPriority(int newPriority)

取得优先级

public final int getPriority()

MAX_PRIORITY = 10; 最高优先级
NORM_PRIORITY = 5; 中等优先级
MIN_PRIORITY = 1; 最低优先级

线程具有继承性:只是继承优先级而已。
从A线程启动B线程,则B和A的线程优先级是一样的。
1.3 守护线程
守护线程是一种特殊的线程(陪伴线程),java中有两种线程,用户线程和守护线程。
用户线程可以理解为普通线程,而守护线程就是等所有用户线程都执行完后才会退出,当前JVM中有任何一个用户线程未停止,守护线程就不能停止工作。只有当最后一个用户线程停止工作时,守护线程才会随着JVM一起停止工作。典型的守护线程就是垃圾回收线程。主线程是用户线程。

Thread类提供isDaemon()区别两种线程:返回false表示该线程为用户线程,否则为守护线程。典型守护线程就是垃圾回收线程。

Thread提供setDaemon()将用户线程设置成为守护线程。
1.4 线程停止方法
我们有三种方法可以停止一个线程
a. 设置标记位停止线程
b. 调用stop()方法强制停止线程,该方法不安全,已经被deprecated
c. interrupt()方法停止

interrupt()方法只是将线程状态置为中断状态而已,它不会中断一个正在运行的线程。此方法只是给线程传递一个中断信号,程序可以根据此信号来判断是否需要终止。相当于系统设置的标志位。

当线程中使用了wait、sleep、join导致线程阻塞,则interrupt()会在线程中抛出InterruptException,并且将线程的中断状态由true置为false。

2. 线程状态转换

线程间状态有以下几个过程:创建、就绪状态、运行状态、阻塞状态、终止
在这里插入图片描述
线程状态转换有几种方法会使线程状态变化发生。
2.1 线程休眠方法:sleep() :运行态 --> 阻塞态
public static native void sleep(long millis) throws InterruptedException
注意传入的时间单位是毫秒
线程休眠:让当前线程先暂缓执行,等到了预定时间再执行
线程休眠使线程从运行态回到阻塞态
休眠结束再从阻塞态回到运行态
在这里插入图片描述
2.2 线程让步方法:yield() :运行态 --> 就绪态
public static native void yield();
线程让步:让当前线程先暂停执行,让其他线程先执行
线程让步:运行态 --> 就绪态
方法执行完后再从就绪态 --> 运行态
调用yield()并不会让线程回到阻塞态,而是回到了就绪态,只需要重新等待重新获取CPU执行时间。
2.3 线程间通信方法:join() :运行态 --> 阻塞态
join()执行完毕线程从阻塞态回到运行态
在这里插入图片描述
等待其他线程终止,是线程间通信的一种方式(我知道你执行完了后,我才能执行)。
等待该线程终止,如果在主线程中调用该方法,会让主线程休眠,让调用该方法的线程先执行完毕后再恢复执行主线程。
join()方法只是对Object类提供的wait () 做了一层包装而已:

// join()源码
public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值