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