-
线程常用方法
1. 设置线程的名称
public final void setName(String name)
参数:name - 这个线程的新名称
2. 得到线程的名称
public final String getName()
返回值:线程的名称
3. 创建线程
public void start()
Java 虚拟机底层调用 start0 方法创建线程
4. 设置线程的优先级
public final void setPriority(int newPriority)
参数:newPriority - 设置此线程的优先级
5. 得到线程的优先级
public final int getPriority()
返回值:这个线程的优先级
6. 线程休眠
public static void sleep(long millis) throws InterruptedException
参数:millis - 以毫秒为单位的睡眠时间长度
异常:InterruptedException - 线程在休眠状态中被调用 interrupt 方法会抛出此异常
7. 中断线程
public void interrupt()
中断此线程,若该线程正在休眠,则会抛出 InterruptedException 异常来提前结束休眠状态
java">public class ThreadMethod01 {public static void main(String[] args) throws InterruptedException {T01 t01 = new T01();t01.setName("T01");t01.setPriority(Thread.MIN_PRIORITY);// System.out.println(t01.getPriority());t01.start();// 主线程打印5次后中断子线程的休眠for (int i = 0; i < 5; i++) {Thread.sleep(1000);System.out.println("hi " + i);}t01.interrupt();}
}class T01 extends Thread {@Overridepublic void run() {while (true) {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + "正在运行..." + i);}try {System.out.println(Thread.currentThread().getName() + "休眠~~~~");Thread.sleep(1000 * 20);} catch (InterruptedException e) {System.out.println(Thread.currentThread().getName() + "被 interrupt 了");}}}
}
8. 线程礼让
public static void yield()
尝试将此线程让出 CPU 资源去执行其他线程,若CPU资源不紧张,则可能礼让不成功,是否礼让取决于 CPU 同一调度
9. 线程插队
public final void join() throws InterruptedException
尝试优先执行此线程,一旦插队成功,则肯定会优先执行完插队的线程
异常:InterruptedException - 线程在插队的状态中被调用 interrupt 方法会抛出此异常
java">public class ThreadMethod02 {public static void main(String[] args) {T02 t02 = new T02();Thread thread = new Thread(t02);try {for (int i = 1; i <= 10; i++) {System.out.println("hi " + i);Thread.sleep(1000);if (i == 5) {thread.start();thread.join();}}} catch (InterruptedException e) {e.printStackTrace();}System.out.println("主线程结束... ");}
}class T02 implements Runnable {@Overridepublic void run() {try {for (int i = 1; i <= 10; i++) {System.out.println("hello " + i);Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}System.out.println("子线程结束... ");}
}
10. 设置守护线程
public final void setDaemon(boolean on)
将调用这个方法后将该线程标记为守护线程,当其他所有线程全部退出后,只剩下守护线程时,守护线程线程自动退出
参数: - 如果 true ,将此线程标记为守护线程
11. 获取线程状态
public Thread.State getState()
返回值:返回线程的状态
-
用户线程和守护线程
1. 用户线程
也叫工作线程,只有当该线程执行完毕,或者以外部通知的方式才会结束
2. 守护线程
一般为工作线程服务,只有当所有的用户线程结束后,守护线程最后才结束。常见的守护线程就是垃圾回收机制
3. 设置守护线程
调用线程的 setDaemom 方法后,将该线程标记为守护线程,只有当其他用户线程全部退出以后,此线程自动最后退出
java">public class ThreadMethod03 {public static void main(String[] args) throws InterruptedException {MyDaemonThread myDaemonThread = new MyDaemonThread();// 想要在主线程结束后就把子线程也一起结束, 需要将主线程设置为子线程的守护线程// 守护线程要先设置在启动myDaemonThread.setDaemon(true);myDaemonThread.start();for (int i = 1; i <= 5; i++) {System.out.println("主线程正在执行 " + i);Thread.sleep(1000);}}
}class MyDaemonThread extends Thread {@Overridepublic void run() {while(true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("工作线程正在执行中... ");}}
}
运行结果:
-
线程状态
NEW
尚未启动的线程处于此状态。
RUNNABLE
在Java虚拟机中执行的线程处于此状态。
BLOCKED
被阻塞等待监视器锁定的线程处于此状态。
WAITING
正在等待另一个线程执行特定动作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
TERMINATED
已退出的线程处于此状态。