实现方式
继承Thread类
1 | public class Method1 { |
实现 Runnable 接口
1 | public class Method2 { |
调试线程的工具
jconsole
通知线程退出
1 | public class Method2 { |
线程常用方法
setPriority interrupt setName
1 | public class Method3 { |
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
31public class Method4 {
public static void main(String[] args) throws InterruptedException {
Son son = new Son();
son.start();
for (int i = 0; i < 20; i++) {
Thread.sleep(1000);
System.out.println("主线程"+i);
if(i == 5){
System.out.println("主动让出子线程");
son.join();
System.out.println("子线程执行完毕");
}
}
}
}
class Son extends Thread{
public void run() {
for (int i = 0; i < 20; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("子线程"+i);
}
}
}
yield
- 礼让线程,主动让出当前执行权限,但不一定成功,只有资源紧张时才会礼让成功
用户(工作)线程、守护线程
- 工作线程:只有任务完成或者被通知结束时才会退出
- 守护线程:当工作线程全部完成或者退出后,守护线程跟着一起退出
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
28public class Method5 {
public static void main(String[] args) throws InterruptedException {
TDemo tDemo = new TDemo();
// 设置为守护线程
tDemo.setDaemon(true);
tDemo.start();
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
System.out.println("主线程工作中。。。");
}
}
}
class TDemo extends Thread{
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("子线程正在工作···");
}
}
}
线程的状态
六种:New、Wait、TimeWait、Runnable、Blocked、Terminated
同步操作
synchronized:既可以修饰对象,也可以修饰方法
1 | public class Method6 { |
- 静态方法被 synchronized 修饰时,同步锁是加到类本身的 即 this
- 非静态方法被 synchronized 修饰时,同步锁时加在对象上的 即 当前类.class