zoukankan      html  css  js  c++  java
  • java 多线程sleep和wait的区别

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

    sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

    在调用sleep()方法的过程中,线程不会释放对象锁。

    而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

    获取对象锁进入运行状态。

    什么意思呢?

    public class MyThread implements Runnable {
        int number = 10;
        public void firstMethod() throws Exception {
            synchronized (this) {
                number += 100;
                System.out.println(number);
            }
        }
        public void secondMethod() throws Exception {
            synchronized (this) {
                /**
                 * (休息2S,阻塞线程)
                 * 以验证当前线程对象的机锁被占用时,
                 * 是否被可以访问其他同步代码块
                 */
                //Thread.sleep(1000);
                //this.wait(2000);
                this.wait(2000);
                number *= 200;
                System.out.println(number);
            }
        }
        @Override
        public void run() {
            try {
                firstMethod();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws Exception {
            MyThread threadTest = new MyThread();
            Thread thread = new Thread(threadTest);
            thread.start();
            
            threadTest.secondMethod();
           
        }
    }

    thread.start()的时候,会调度另外一个线程,但是需要时间明显比直接继续执行主线程代码块,因为从代码栈取值。不管怎么对于这个例子都是先运行 threadTest.secondMethod();

    如果是this.wait(2000)的时候,就会放弃对象锁,该进程进入等待锁定池,切入到另外一个线程run,输出“110”  然后结束之后进入到threadTest.secondMethod(); 输出“22000”

    结果如下:

      这个数字输出间隔是2秒

    public class MyThread implements Runnable {
        int number = 10;
        public void firstMethod() throws Exception {
            synchronized (this) {
                number += 100;
                System.out.println(number);
            }
        }
        public void secondMethod() throws Exception {
            synchronized (this) {
                /**
                 * (休息2S,阻塞线程)
                 * 以验证当前线程对象的机锁被占用时,
                 * 是否被可以访问其他同步代码块
                 */
                Thread.sleep(1000);
                //this.wait(2000);
                //this.wait(2000);
                number *= 200;
                System.out.println(number);
            }
        }
        @Override
        public void run() {
            try {
                firstMethod();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws Exception {
            MyThread threadTest = new MyThread();
            Thread thread = new Thread(threadTest);
            thread.start();
            
            threadTest.secondMethod();
           
        }
    }

    对于这个Thread.sleep(1000)的时候,执行到这句话的时候,不会放弃对象锁,就是说,等待一秒钟之后,输出结果是“2000”  然后输出“2100”

    j结果如下:

    注意:此分析只是适合这个例子。

    就是说:-------------------------------------------------------------------------下面这句话大神看一下,我说的对不对-----------------------------------

    如果thread.start() 到执行下面最近的方法之间花费的时间,大于线程调度的时间,就先执行run方法,再执行下面的代码栈的方法threadTest.secondMethod();。不知道我理解的对不对,大家帮忙看看!

    谢谢!

     线程的调度 
            线程调度器按线程的优先级高低选择高优先级线程(进入运行中状态)执行,同时线程调度是抢先式调度,即如果在当前线程执行过程中,一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行。


    抢先式调度又分为:时间片方式和独占方式。在时间片方式下,当前活动线程执行完当前时间片后,如果有其他处于就绪状态的相同优先级的线程,系统会将执行权交给其他就绪态的同优先级线程;当前活动线程转入等待执行队列,等待下一个时间片的调度。 
    在独占方式下,当前活动线程一旦获得执行权,将一直执行下去,直到执行完毕或由于某种原因主动放弃CPU,或者是有一高优先级的线程处于就绪状态。

  • 相关阅读:
    装饰者模式
    NGUI研究院之三种方式监听NGUI的事件方法(七)
    unity3d连接数据库
    unity3d 连接MSSql
    Unity3D之游戏架构脚本该如何来写
    WCF 部署问题 小总结 (HTTP 不能注册的解决方法)
    Prototype
    web.config文件之自定义错误节
    asp:DropDownList与asp:DataList的联合使用
    剑指offer --合并链表
  • 原文地址:https://www.cnblogs.com/wuyuankun/p/3728682.html
Copyright © 2011-2022 走看看