精华内容
下载资源
问答
  • 而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程 sleep()可以将一个线程睡眠,参数可以指定一个时间。 而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。  wait有两种形式...

    今天面试问到了这个问题,没有回答上来。在网上找了一下,发现说的非常清楚。所以保存下来了……


    这两者的施加者是有本质区别的. 
    sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制. 


    而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行. 


    其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题


     在java.lang.Thread类中,提供了sleep(),
    而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程
    sleep()可以将一个线程睡眠,参数可以指定一个时间。
    而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
        wait有两种形式wait()和wait(milliseconds).
    sleep和wait的区别有:
      1,这两个方法来自不同的类分别是Thread和Object
      2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
      3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
        任何地方使用
       synchronized(x){
          x.notify()
         //或者wait()
       }
       4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

    展开全文
  • Object类九大方法wait方法

    千次阅读 2019-08-13 13:22:46
    Object类九大方法wait方法 wait、notify和notifyAll方法Object类的final native方法。所以这些方法不能被子重写,Object类是所有的超类,因此在程序中有以下三种形式调用wait方法wait();//方式1: ...

    Object类九大方法之wait方法

    wait、notify和notifyAll方法是Object类的final native方法。所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序中有以下三种形式调用wait等方法。

    wait();//方式1:
    
    this.wait();//方式2:
    
    super.wait();//方式3
    
    

    void notifyAll()

    解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

    void notify()

    随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常.

    void wait()

    导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

    void wait(long millis) 和void wait(long millis,int nanos)

    导致线程进入等待状态直到它被通知或者经过指定的时间。这些方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。

    Object.wait()和Object.notify()和Object.notifyall()必须写在synchronized方法内部或者synchronized块内部,这是因为:**这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。**即使你确实知道当前上下文线程确实拥有了对象锁,也不能将object.wait()这样的语句写在当前上下文中。

    展开全文
  • 主要介绍了Object类wait及notify方法原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了java Object wait方法详细介绍的相关资料,需要的朋友可以参考下
  • 为什么wait()和notify()属于Object类

    千次阅读 2018-03-21 14:06:45
    关于wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();...如下:Object obj = newObject();synchronized(obj){ try{ obj.wait(); }catch(Exception e){} obj.notify(); }...

    关于wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();

    notify()唤醒的是等待锁的对象,调用:对象.notify();

    如下:

    Object obj = newObject();

    synchronized(obj){

        try{  

          obj.wait();

          }catch(Exception e){}

          obj.notify();

      }

    注意:wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。

    为什么这些操作线程的方法要定义在object类中呢?

    简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。

    专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

    也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。 

    在jdk1.5以后,将同步synchronized替换成了Lock,将同步锁对象换成了Condition对象,并且Condition对象可以有多个,这样可以解决一个问题。

    比如说我们在多个生产者和消费者模式中:

    boolean flag = false;

    public synchronized void set(String name){

      while(flag){//用while而不用if的原因,这样每个线程在wait等待醒来后都必须再次判断flag

        try{this.wait();}catch(Exception e){}  

        Sytem.out.printLn("生产者");

        flag = true;

        this.notifyAll();//这将唤醒所有线程(本方线程和对方线程),消耗资源

      }

    }

    public synchronized void out(){

      whie(!flag){

         try{this.wait();}catch(Exception e){}

        Sytem.out.printLn("消费者");

        flag = false;

        this.notifyAll();//这将唤醒所有线程(本方线程和对方线程),消耗资源

      }

    }

    上面的做法很消耗资源,如果把notifyAll()改成notify()的话,就会造成可能所有线程都在等待 

    所以在jdk1.5以后提供了Lock接口和Condition对象。Condition中的await(), signal().signalAll()代替Object中的wait(),notify(),notifyAll()

    private Lock lock = new ReentrantLock();

    private Condition condition_pro = lock.newCondition();//生产者对象

    private Condition condition_con = lock.newCondition();//消费者对象

    public void set(String name) throws Exception{

      lock.lock();//加锁

      try{

        while(flag){

         contion_pro.await();

         Sytem.out.printLn("生产者");

           flag= true;

         condition_con.singal();//指定唤醒消费方

       }finally{

        lock.unlock();//解锁    

        }  

      }

    }

    public void out() throws Exception{

      lock.lock();

      try{

        while(!flag){

           condition_con.await(); 

           Sytem.out.printLn("消费者");

           flag = false;

           condition_pro.signal();//指定唤醒生产方

          }finally{

          lock.unlock();  

          }

        }

    }

    这样做的好处,我们可以指定唤醒某一方,减少消耗.


    原文地址:https://www.cnblogs.com/lirenzhujiu/p/5927241.html


    展开全文
  • Object wait方法

    千次阅读 2017-02-04 14:54:22
    Objectwait方法 synchronized (obj) { while (condition does not ok){ obj. wait (); } } 如果想让线程A处于等待状态,可以调用当前对象 wait 方法wait方法一旦被调用,也就意味着: ...

    概述


    当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁。

    但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码。等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,让线程A从等待状态变成执行状态,继续执行代码。

    有些同学认为线程A也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗CPU,而且也不知道条件何时才能满足。

    线程之间要协调沟通,必须有一个等待机制和通知机制,在JAVA里面,对应的就是wait方法和notify方法。


    Object的wait方法


     synchronized (obj) {
           while (condition does not ok){
               obj.wait();
           }
     }

    如果想让线程A处于等待状态,可以调用当前对象wait方法。wait方法一旦被调用,也就意味着:线程A已经获得锁了,而且能做的事情都已经做了,现在只能等待了,等待另外的同步操作执行某些代码后,我才回来继续干活。

    注意:
    wait方法是定义在根类Object上的,Thread继承自Object类,自然也有wait方法。但是这里并不是调用当前线程对象wait方法,而是具有锁属性的当前对象wait方法;这一点我也不太理解,我觉得要做到线程A切换到等待状态,之后被人唤醒,就算使用线程A的wait方法和notify方法其实也是可以做到的,但是估计实现起来非常麻烦。另外从场景上看,wait定义在Object也比较合理,表示线程挂在了对象的等待池中。

    展开全文
  • 为何 wait,notify 和 notifyAll 属于 Object ? 为什么它们不应该在 Thread 中? 以下观点我认为是有道理的: wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。对...
  • Object类中的wait()方法和notify()方法

    千次阅读 2017-06-04 10:54:31
    Object类中的wait()方法和notify()方法wait(): public final void wait(long timeout) throws InterruptedException 参数:等待的时间,可选,不填则默认为0。 说明: 1>使线程主动释放对象锁,...
  • 在JAVA中,下列哪些是Object类方法()synchronized()wait()notify()notifyAll()sleep() 答案:bcd链接:https://www.nowcoder.com/questionTerminal/7676c6f03b134cad8870c6899bc695aa来源:牛客网A ...
  • wait()、notify()和notifyAll()方法为什么属于Object

    千次阅读 热门讨论 2019-01-27 15:59:37
    要搞清这个问题,我们首先需要知道wait()、notify()和notifyAll()是干吗的,然后才能够知道它们为什么属于Object。就以wait为例吧,wait的含义是使当前线程放弃对象锁,并进入阻塞状态。 原因 原因一:Java中,...
  •  首先,yield方法是Thread对象提供的方法waitObject对象提供的方法可以看到线程一共有下面的几种状态。 1. 新建(new):新创建了一个线程对象。2. 可运行(runnable):线程对象创建后,其他线程(比如main线程...
  • 为什么Wait和notify方法Object中?

    千次阅读 2020-11-27 09:05:28
    为何 wait,notify 和 notifyAll 属于 Object ? 为什么它们不应该在 Thread 中? 以下观点我认为是有道理的: wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。 ...
  • 这两者的施加者是有本质区别的. sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,...而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",
  • java.lang包下Thread的 sleep(long millis) 方法: 该方法是一个静态方法,直接用Thread调用 该方法的作用是让调用该方法的线程睡眠指定的时间(单位:毫秒),参数中需要指定一个睡眠时间,过了该睡眠时间...
  • 一、基础篇--1.1Java基础-Object类中常见的方法,为什么wait notify会放在Object里边 这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法。回答这些问题的...
  • Java中的Object类

    万次阅读 多人点赞 2019-05-11 14:54:16
    Object作为所有的父类,是面向对象学习中最重要的一个Object类是java默认的提供的一个Object类是所有的父类,也就是说任何一个的定义的时候如果没有明确的继承一个父类的话,那么它就是Object的子类
  • Object wait notify notifyAll 方法详解

    千次阅读 2018-11-01 14:52:49
    wait()方法表示,放弃当前对资源的占有权,等啊等啊,一直等到有人通知我,我才会运行后面的代码。 notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够...
  • Object类方法

    万次阅读 多人点赞 2016-12-05 18:20:05
    前言Java语言不同于C++语言,是一种...如图可知,Object类有12个成员方法,按照用途可以分为以下几种 1,构造函数 2,hashCode和equale函数用来判断对象是否相同, 3,wait(),wait(long),wait(long,int),notify(),not
  • 为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread中 因为java中每个对象都有一把称之为monitor监控器的锁 由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置 这个锁是...
  • 一、这里先来介绍下objectwait、notify和...所以这些方法不能被子重写,Object类是所有的超类,因此在程序中有以下三种形式调用wait方法wait();//方式1: this.wait();//方式2: super.wait();//方
  • java中Object类方法

    千次阅读 2017-12-09 16:51:20
    终极父类什么是Object类Object类存储在java.lang包中,是所有java(Object类除外)的终极父类。当然,数组也继承了Object类。然而,接口是不继承Object类的。Object类中声明了以下函数protected Object clone() ...
  • wait notify 都是Object方法

    千次阅读 2012-02-02 16:15:56
    注:wait notify 都是Object方法 同步(阻塞) :是一种防止对共享资源访问导致的数据不一致的一种模式。 详细请参看操作系统。 在Java中,由于对多线程的支持,对同步的控制主要通过以下几个方法,...
  • sleep是Thread方法waitObject类方法。 区别: sleep方法是Thread的静态方法,调用此方法会让当前线程暂停指定的时间,将执行机会(CPU)让给其他线程,但是不会释放锁,因此休眠时间结束后自动恢复...
  • object类的9个方法

    千次阅读 2016-04-15 08:42:56
    object类有9个方法
  • 【Java Tip】(三) Object类wait()与nofity()

    千次阅读 2016-12-08 21:18:48
    Object类wait()与nofity()详解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 253,524
精华内容 101,409
关键字:

wait方法属于object类