show PROCESSLIST 有大量sleep 线程 sleep 线程状态_同步锁


常用方法:

方法

解释

setPriority(int newPriority)

更改线程的优先级

static void sleep(long millis)

在指定的毫秒内让当前正在执行的线程休眠

void join()

等待线程终止

static void yield()

暂停当前正在执行的线程对象,并执行其他线程

void interrupt()

中断线程,别用这个方式

boolean isAlive

测试线程是否处于活动状态

线程休眠:

  • sleep(时间)指定当前线程阻塞的毫秒数
  • sleep存在异常InterruptedException
  • sleep时间达到后线程进入就绪状态
  • sleep可以模拟网路演示,倒计时等
  • 每一个对象都有一个锁,sleep不会释放锁

线程礼让:

  • 礼让线程:让当前正在执行的线程暂停,但不阻塞
  • 让线程从运行状态转为就绪状态
  • 让cpu从新调度,礼让不一定成功

join:

  • join 合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞。
  • 可以想象成插队

线程状态:

  • NEW

尚未启动的线程处于此状态

  • RUNNABLE

在Java虚拟机中执行的线程处于此状态

  • BLOCKED

被阻塞等待监视器锁定的线程处于此状态

  • WAITING

正在等待另一个线程执行特定动作的线程处于此状态

  • TIMED_WAITING

正在等待另一个线程执行动作达到指定等待时间的线程处于此状态

  • TERMINATED

已退出的线程处于此状态
一个线程可以在给定时间点处于一个状态。这些状态是不反应任何操作系统线程状态的虚拟机状态
测试一下:

public class ThreadDemo3 {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("//");
        });

        //观察状态
        Thread.State state = thread.getState();
        System.out.println(state);

        //观察启动后
        thread.start();
        state = thread.getState();
        System.out.println(state);

        while (state != Thread.State.TERMINATED) {//线程不终止,一直输出
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            state = thread.getState();//更新状态
            System.out.println(state);
        }
    }
}

输出结果为:

show PROCESSLIST 有大量sleep 线程 sleep 线程状态_java_02


show PROCESSLIST 有大量sleep 线程 sleep 线程状态_同步锁_03


这里我们可以看到输出的状态

  1. 新建(NEW):新创建了一个线程对象。
  2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
  3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
  4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:
    (一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
    (二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
    (三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
  5. 死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。