-
线程常用方法
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 异常来提前结束休眠状态
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 {
@Override
public 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 方法会抛出此异常
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 {
@Override
public 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 方法后,将该线程标记为守护线程,只有当其他用户线程全部退出以后,此线程自动最后退出
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 {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("工作线程正在执行中... ");
}
}
}
运行结果:
-
线程状态
尚未启动的线程处于此状态。
在Java虚拟机中执行的线程处于此状态。
被阻塞等待监视器锁定的线程处于此状态。
正在等待另一个线程执行特定动作的线程处于此状态。
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
已退出的线程处于此状态。