初识Java多线程之多线程中的常用方法

多线程中的常用方法

  1. start() 启动当前线程,并调用当前线程的run方法
  2. run() 重写Thread或Runnable的run,供系统调用,不得手动调用
  3. currentThread() Thread中的静态方法,获取当前线程
  4. getName() 获取当前线程的名称
  5. setName() 设置当前线程的名称
  6. yield() 释放当前CPU的执行权
  7. join() 当线程a调用线程b的join方法,线程a就进入阻塞状态,直至线程b执行结束。
  8. stop() 已过时,强制结束当前线程
  9. sleep(long time) 使当前线程进入睡眠状态,time为睡眠的毫秒数。睡眠时线程处于阻塞状态
  10. 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
29
package 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
30
package 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();
}

}