Thread类
常用方法
对象方法
start方法:启动线程,调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,同时,会为线程分配资源。
run方法:用户不需要调用,当start方法启动线程并获得CPU执行时间后,便自动执行run方法体中的任务。(所以,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务)。
isAlive方法:判断线程是否处于活动状态
sleep方法:交出CPU让线程睡眠,CPU可执行其他任务。
yield方法:该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行)。但是yield不能控制具体的交出CPU的时间,只能让相同优先级的线程获取CPU执行时间的机会。
注意,调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。join方法:让“主线程”等待“子线程”结束之后才能继续运行。实际上,调用join方法是调用了Object的wait方法,wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限,所以join方法同样会让线程释放对一个对象持有的锁。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36public class MainThread extends Thread {
public void run() {
System.out.println(this.getName() + "开始执行");
for (int i = 0; i <= 10; i++) {
if (i == 3) {
SubThread st = new SubThread();
st.start();
try {
st.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(this.getName() + "执行完毕");
}
}
public class SubThread extends Thread {
public void run() {
System.out.println(this.getName() + "开始执行--->>>");
// 延时操作
for (int i = 0; i < 5; i++) {
System.out.println(this.getName() + "执行中--->>>");
}
System.out.println(this.getName() + "执行完成");
}
}
public class App {
public static void main(String[] args) throws InterruptedException {
MainThread mt = new MainThread();
mt.start();
}
}输出结果:
1
2
3
4
5
6
7
8
9Thread-0开始执行
Thread-1开始执行--->>>
Thread-1执行中--->>>
Thread-1执行中--->>>
Thread-1执行中--->>>
Thread-1执行中--->>>
Thread-1执行中--->>>
Thread-1执行完成
Thread-0执行完毕说明:MainThread线程中启动了SubThread线程,等待SubThread执行完,主线程MainThread继续执行
- interrupt方法:中断;
一、可以中断一个正处于阻塞状态的线程;
二、通过组合interrupt方法和isInterrupted()方法可停止正在运行的线程。
- getId方法:获取线程的唯一标识
1
2
3
4
5public static void main(String[] args) throws InterruptedException {
// getId 获取线程唯一标识
Thread runThread = Thread.currentThread();
System.out.println(runThread.getName() + " " + runThread.getId());
} - wait方法:使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。