多线程中的常用方法
- 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();
    }
}