多线程中的常用方法
- start() 启动当前线程,并调用当前线程的run方法
- run() 重写Thread或Runnable的run,供系统调用,不得手动调用
- currentThread() Thread中的静态方法,获取当前线程
- getName() 获取当前线程的名称
- setName() 设置当前线程的名称
- yield() 释放当前CPU的执行权
- join() 当线程a调用线程b的join方法,线程a就进入阻塞状态,直至线程b执行结束。
- stop() 已过时,强制结束当前线程
- sleep(long time) 使当前线程进入睡眠状态,time为睡眠的毫秒数。睡眠时线程处于阻塞状态
- isAlive() 判断当前线程是否存活
下面我们来着重说明一下 yield(), join() 两个方法,其他方法都是字面意思不再另外说明
yield
当线程a调用yield方法是会让出CPU执行权,此时线程a和线程b重新开始CPU执行权争抢,谁抢到谁执行。yield不保证线程b一定能够抢到CPU执行权,可能还是线程a在执行
示例代码: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
29package com.example.socket.multithreading;
/**
* 当线程a调用yield方法是会让出CPU执行权,此时线程a和线程b重新开始CPU执行权争抢,谁抢到谁执行。
* yield不保证线程b一定能够抢到CPU执行权,可能还是线程a在执行
* 注:该段代码必须在jdk1.8及以上版本才能运行
*/
public class YieldThread {
public static void main(String[] args) {
// lambda表达式
Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
if (i == 20) {
Thread.yield();
}
}
});
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
});
thread.start();
thread1.start();
}
}
join
当线程a调用线程b的join方法,线程a就进入阻塞状态,直至线程b执行结束,线程a再执行。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
30package com.example.socket.multithreading;
/**
* 当线程a调用线程b的join方法,线程a就进入阻塞状态,直至线程b执行结束,线程a再执行。
*/
public class JoinThread {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
});
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
if (i == 20) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
thread1.start();
}
}