zoukankan      html  css  js  c++  java
  • sleep() 和wait() ,线程状态

    Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。 
    共同点 : 
    1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。 
    2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。 
    如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。 
    需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。 
    不同点 : 
    1.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。 
    sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 
    2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
    3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 
    4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
    5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,通过该对象的notify或者notifyAll来获取对象锁,并进入等待状态,等待CPU。

    ② 锁:  最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

    sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

    Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

    ③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

       synchronized(x){ 
          x.notify() 
         //或者wait() 
       }


    sleep 和 wait都需要捕获InterruptedException: 
    public final void wait() throws InterruptedException {
    wait(0);
    }

    public final native void wait(long timeout) throws InterruptedException;

    public static native void sleep(long millis) throws InterruptedException;
     
    一. 线程状态类型
    1. 新建状态(New):新创建了一个线程对象
    2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权
    3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码
    4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
        (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中
        (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中
        (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态
    5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期
     线程状态图
     
     
     
  • 相关阅读:
    MySQL5.7的安装配置
    Curl工具的使用
    sublime text配置node.js调试
    Docker windows下安装并搭建Nodejs的webapp
    Django URLs error: view must be a callable or a list/tuple in the case of include()
    Windows下Django环境搭建
    vscode 调试node.js
    python的字节编译
    堡垒机实例以及数据库操作
    Django admin模块无法调用css样式文件
  • 原文地址:https://www.cnblogs.com/wsnan/p/12292926.html
Copyright © 2011-2022 走看看