notify等关于线程的方法为什么放在了object类里?

各位大侠,小弟不懂求指教 ,notify等关于线程的方法为什么放在了object类里?

1个回答

任何对象都可以被多个线程竞争,此时对象需要同步,所有Object就有了wait,notify等方法

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么wait与notify设计在Object类中?
答案 因为synchronized关键词(设计的初衷可能是为了简化多线程程序的编写)可以加在每个类的方法之上。 每个对象都有一个monitor(因此每个对象都潜在需要线程同步),虚拟机在执行synchronized修饰的代码块时,需要获取该对象的monitor。 对象同步可以一定程度上通过synchronized(本质上是monitor)完成,而当需要通过“阻塞”、“唤醒”完成对象同步时,s...
线程基础notify()方法
[code=Java]rnclass ThreadB extends Threadrn int total = 0;rn public void run()rn synchronized(this)rn System.out.println("ThreadB is running...");rn for(int i=0;i<100;i++)rn total += i;rn rn System.out.println("total is "+total);rn //notify(); rn rn rnrnpublic class ThreadArn public static void main(String args[])rn ThreadB b = new ThreadB();rn b.start();rn synchronized(b)rn System.out.println("Waiting for b to complete...");rn tryrn Thread.sleep(3000);rn b.wait(); rn catch(InterruptedException e) rn System.out.println("Completed.Now back to main thread");rn rn System.out.println("....Total is:"+b.total);rn rnrn/*主线程先得到b的锁,执行到b.wait();的时候,主线程阻塞,释放对象锁,线程b变为运行状态,把notify()注释掉,rn没有唤醒主线程,主线程为什么还能继续进行?rn[/code]
线程的notify()和wait()方法
[code=Java]rnclass ThreadB extends Threadrn int total = 0;rn public void run()rn synchronized(this)rn System.out.println("ThreadB is running...");rn for(int i=0;i<100;i++)rn total += i;rn System.out.println("total is "+total);rn rn notify();rn //这句的意思是不是假如A线程放弃了锁,B线程得到锁,执行run()方法,rn //执行完毕后再唤起A线程?(2)rn rn rnrnpublic class ThreadArn public static void main(String args[])rn ThreadB b = new ThreadB();rn b.start();rn synchronized(b)rn System.out.println("Waiting for b to complete...");rn tryrn b.wait(); rn //主线程先获得了对象锁,执行到这儿时,表示当前线程释放该对象锁,是不是?rn //用b.wait(); 字面意思好难理解啊...(1)rn catch(InterruptedException e) rn System.out.println("Completed.Now back to main thread");rn //上面的语句,当(2)处没写notify()的时候,主线程没被唤醒怎么执行后面的语句的?rn //(3)rn rn System.out.println("....Total is:"+b.total);rn rnrn[/code]rn各位网友,如题,学习中,帮指点下子。。。感谢
Object的notify和notifyAll方法的区别
区别 notify:只会唤醒等待该锁的其中一个线程。 notifyAll:唤醒等待该锁的所有线程。 既然notify会唤醒一个线程,并获取锁,notifyAll会唤醒所有线程并根据算法选取其中一个线程获取锁,那最终结果不都是只有一个线程获取锁吗?那JDK为什么还需要做出来这两个方法呢?这两种同步方法本质上会有什么区别? 这还要从对象内部锁的调度说起。 对象内部锁 其实,每个对象都拥有两个池,分...
线程中Thread类和Object类的方法
Thread类:start、run、sleep、stopObject类:wait、notify、notifyAll,这三个方法都依赖锁对象,所对象可以是任意对象,所以定义在Object中start()和run()的区别start():启动线程并调用线程中的run()方法。run():执行该线程对象要执行的任务sleep()和wait()的区别sleep():不释放锁对象,释放CPU使用权在休眠的时...
Java里Object类的方法
Java语言不同于C++语言,是一种单继承结构语言,也就是说,Object类是所有类的父类,位于java.lang包中。(PS:任何类的对象,都可以调用Object类中的方法,包括数组对象。)object类的结构Object类有12个成员方法,按照用途可以分为以下几种:1)构造函数 2)hashCode和equale函数用来判断对象是否相同, 3)wait(),wait(long),wait(lo...
object类里面的方法
object类中的方法1.toString打印对象的信息,返回对象的字符串表示public String toString() { return getClass().getName() + &quot;@&quot; + Integer.toHexString(hashCode()); }2.finalize垃圾回收时调用protected void finalize() throws Throwable ...
关于线程 wait() notify()
那位朋友帮忙看看, 下面的程序为什么不是输出rnLordrnVoldemortrnLordrnVoldemortrnLordrnVoldemortrnLordrnVoldemortrn.....rnrn怎样修改才可以让他像上面一样输出. 谢谢.rnrnrnimport java.io.IOException;rnrnpublic class ForTest extends Thread rnrn ForTest() rn Thread lord = new ForTest("Lord");rn Thread voldemort = new ForTest("Voldemort");rn lord.start();rn voldemort.start();rn rnrn ForTest(String n) rn this.setName(n);rn rnrn public synchronized void printLord() rn System.out.println("Lord");rn notify();rn rnrn public synchronized void printVoldemort() rn System.out.println("Voldemort");rn try rn wait();rn catch (Exception e) rn System.out.println(e);rn rn rnrn public synchronized void doc() rn try rn if ("Lord".equals(Thread.currentThread().getName())) rn this.printLord();rn rnrn if ("Voldemort".equals(Thread.currentThread().getName())) rn this.printVoldemort();rn rn Thread.currentThread().sleep(500L);rn catch (Exception e) rn // TODO: handle exceptionrn System.out.println(e);rn rnrn rnrn public void run() rn while (true) rn this.doc();rn rn rnrn public static void main(String[] args) rn ForTest f = new ForTest();rn rnrn
关于线程的notify()问题
run()rnrnrnanotherThread.notify();rn...........//请问执行了notify()后,notify()后面的内容还会不会执行?rnrn
Object 关于线程的几个方法
1 sleep() : 当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行, 同时sleep函数不会释放锁资源.   2 yield(): 只是使当前线程重新回到可执行状态,所以执行yield()线程有可能在进入到可执行状态后马上又被执行.   sleep和yield的区别在于, sleep可以使优先级低的线程得到执行的机会, 而yield只能使同优先级的线程...
wait,notify,notifyAll,sleep这些方法都跟线程的状态变化有关,为什么jdk把前三个方法放在Object类里面,而把sleep放在Thread类里面?
首先,虽然这些方法都跟线程的状态变化有关,但wait(),notify(),notifyAll()这三个方法在用法上就跟sleep()方法不太一样,wait(),notify(),notifyAll()必须在sychronized同步代码块中使用,且要用当前线程持有的锁来调用,比如锁.wait(),锁.notify(),而sleep()方法则是Thread类的一个静态方法,直接通过Thread类调...
关于线程的notify
notify是叫醒一个在当前对象wait的线程 那么如果我当前对象有3个线程 我想叫醒我要指定的一个线程怎么办 而notify没有穿参
关于线程的wait()和notify()
我在看O'reilly的<>时,看到了如下一段代码,各位高手能否帮助小弟分析一下,谢谢!rnrn代码如下:rnrnpublic class Barrierrn private int thread2wait4;rn private InterruptedException iex;rn rn public Barrier(int nThreads)rn threads2wait4 = nThreads;rn rn rn public synchronized int waitForRest()rn throws InterruptedExceptionrn int threadNum = --threads2wait4;rn rn if(iex!=null) throws iex;rn if(threads2wait4 <= 0)rn notifyAll();rn return threadNum;rn rn while(threads2wait4 > 0)rn if(iex != null) throw iex;rn tryrn wait();rn catch (InterruptedException ex)rn iex = ex;rn notifyAll();rn rn rn return threadNum; rn rn rn public synchronized void freeAll()rn iex = new InterruptedException("Barrier Released by freeAll");rn notifyAll();rn rnrnrn疑问如下:rn1,书中说"每一个到达屏障的线程都调用wait()方法,而当最后一个线程到达时,就要通知所有等待的线程"对于这一点我能够理解,它又说"如果其中任何一个等待线程收到中断信号,则所有的线程都应该收到同样的中断信号",这句话该怎么理解?rnrn2,当调用了wait()方法的线程,收到了notify()通知,并获取了锁以后,要重新执行run方法吗?还是从被中断出继续执行?rnrn请各位高手给我这个初学者解答,谢谢!
并发编程(6)Object类对线程的操作(wait/notify/notifyAll)
Java Object 类也提供了线程操作的方法,下面我们来了解一下 .1)wait wait方法为Object类的方法,主要用于线程间通信,调用wait()方法的时候,线程会放弃对象锁(sleep 不会放弃对象锁),进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定。 注:因为wait方法放弃了对象锁,所以同步代码块可以被访问。
object的notify、wait对线程使用的理解
在线程中,notify、wait的会唤醒一个
_038_线程的方法wait、notify
====================== 线程的方法: 以下方法均属于object,意思就是说随便一个对象都可以调用 void     wait()            在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。           一个线程如果执行了wait方法,那么该线程就会进去一个以锁为标识符的线程池中等待          ...
线程通讯 Object对象的wait和notify方法使用,
    36套java进阶高级架构师视频+38套大数据视频  保证全是硬货需要的 +微信: du13797566440 /**  * 作者:dlj   * 描述:Object对象的wait和notify方法使用,wai释放锁,notify不释放锁,必须配合synchronized 使用同一把锁  * 需求:当list1.size==5时唤醒线程2  * 时间:2017年12月19日下午6:...
线程中的wait和notify方法
1. 多线程中wait和notify方法请先阅读下我的博客中关于线程的状态的两篇文章后,再来阅读这篇文章,药物配合吃,疗效更加【坏笑】。 http://blog.csdn.net/duxingxia_007/article/details/49310275 http://blog.csdn.net/duxingxia_007/article/details/47009445 这两个方法是一
线程方法wait()和notify()的使用
实现需求:开启2个线程,1个线程对某个int类型成员变量加1,另外1个减1,但是要次序执行,即如果int型的成员变量是0,则输出01010101这样的结果代码如下package test; public class Sample { private int i; public synchronized void increase() { if(i != 0)...
关于Object类的GetType()方法
.Net中,object类的GetType()方法不是虚方法,也就是说派生类不能通过重写它来给客户端隐藏自己的类型,既然不能重写,那么我想知道派生类什么时候有机会可以提供自己正确的类型信息?另外如果这样,我对派生类调用这个GetType()方法,得到的是不是仍然是object的类型?这样就不对了,很疑惑,希望高手来帮我解释一下。
关于Object类的getClass()方法
[code=&quot;java&quot;] import java.util.Date; public class TestCode extends Date { public static void main(String[] args) { new TestCode().test(); } public void test() { System.out.println(...
Java中Object类的wait()和notify()方法怎么使用
http://wenwen.soso.com/z/q129287952.htm 看一个生产者-消费者问题 class Test { public static void main(String[] args) { Queue q=new Queue(); Producer p=new Producer(q); Consumer c=new Consumer(q);...
线程notify()
package student;rnclass teacherrn public synchronized void say()rn rn rn System.out.println("在说话");rn //Thread.sleep(100000);rn rn try rn this.wait();rn catch (InterruptedException e) rn rn e.printStackTrace();rn rn System.out.println("我醒了@");rn rn rn public synchronized void sayhello()rn System.out.println("我在说hello");rn rn rn rnrn class thread1 implements Runnablern public static teacher tea=new teacher();rn public void run()rn rn rn try rn tea.say();rn rn rn rn catch (Exception e) rn rn e.printStackTrace();rn rn rn rnrn rn rnrn rn public class Demorn rn public static void main(String[] args)rn rn rn thread1 tre=new thread1();rn new Thread(tre).start();rn try rn Thread.sleep(1222);rn catch (InterruptedException e) rn rn e.printStackTrace();rn rn thread1.tea.sayhello();rn thread1.tea.notify();//这里提示错误了!rn rn rn rn rn rn 提示是:java.lang.IllegalMonitorStateException异常!、rn请大虾看看!rn
使用Condition类来代替 Object 监视器方法(wait,notify)
java.util.concurrent.locks 包中,规定了三个接口,来代替synchronized和Object的监视器方法,wait,notify。即帮助我们更加灵活的控制线程的状态和同步。至于如何使用Lock请参考ReentrantLock和synchronized的区别Condition 代替Object的监视器方法,wait,notify。Lock  代替synchronized关...
java线程的notify方法,wait方法
以下代码本以为会重复输出 01直到结束,但是实际结果是:有时候能顺利正确的执行完,也有时候会执行到一点就卡住rn不再继续往下执行,只能强制关闭程序。rnpublic class B02Notifyrnrn public static void main(String[] args)rn rn Sample sample = new Sample();rn rn Increase in1 = new Increase(sample);rn Increase in2 = new Increase(sample);rn Decrease de1 = new Decrease(sample);rn Decrease de2 = new Decrease(sample);rn rn in1.start();rn de1.start();rn in2.start();rn de2.start();rn rnrnclass Samplernrn private int a;rn rn public synchronized void increase() rn rn while(a != 0)rn rn tryrn rn wait();rn rn catch (InterruptedException e)rn rn e.printStackTrace();rn rn rn rn a++;rn System.out.println(a);rn rn notify();rnrn rn rn public synchronized void decrease()rn rn while(a == 0)rn rn tryrn rn wait();rn rn catch (InterruptedException e)rn rn e.printStackTrace();rn rn rn rn a --;rn System.out.println(a);rn rn notify();rn rnrnrnclass Increase extends Threadrnrn private Sample sample;rn rn public Increase(Sample sample)rn rn this.sample = sample;rn rn rn @Overridern public void run()rn rn for(int i = 0; i < 20; i++)rn rn sample2.increase2();rn rn rnrnrnclass Decrease extends Threadrnrn private Sample sample;rn rn public Decrease(Sample sample)rn rn this.sample = sample;rn rn rn @Overridern public void run()rn rn for(int i = 0; i < 20; i++)rn rn sample.decrease();rn rn rnrn然后,我将Decrease和Increase类中的run()都修改成:rn public void run()rn rn for(int i = 0; i < 20; i++)rn rn tryrn rn Thread.sleep((long)(Math.random() * 1000));rn rn catch (InterruptedException e)rn rn e.printStackTrace();rn rn sample2.increase2();rn rn rn 最终结果就是正确的循环输出1010101010........。 本人初涉java,望大鸟门指点迷境。rn
通过Object中wait以及notify等方法实现线程通信
本课程是《Java初级至应用》系统课程的第三模块,全套课程精细讲解,课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java工程师或系统架构师岗位,课程提供全套代码笔记其它相关素材及答疑服务,可谓是低投资高回报!学习前或学习后有任何疑问请在课程中提问,老师看到会第一时间回复!
为什么wait()和notify()必须放在synchronized里面?
我们都知道在调用Object.wait()时必须在synchronized块里面,否则会抛出 IllegalMonitorStateException。但是为什么会有该限制,为什么wait()和notify()同时出现才有意义。wait()往往需要在condition上面协同使用,如果condition不能满足,那么将一直等待。所以一般是这样使用:if(!condition){ step1 wai...
关于notify 和notifyAll方法
看这段程序rnpackage org.arcie.simulator.test;rnrnpublic class NotifyTest implements Runnable rn rn private Wait wait; rn rn public NotifyTest(Wait wait) rn this.wait = wait; rn rn public void run() rn rn wait.doSomthing(); rn rn rn public static void main(String [] args) rn Wait wait = new Wait(4,"DAVID"); rn Thread t1 = new Thread(new NotifyTest(wait)); rn Thread t2 = new Thread(new NotifyTest(wait)); rn Thread t3 = new Thread(new NotifyTest(wait)); rn Thread t4 = new Thread(new NotifyTest(wait)); rn rn t1.start(); rn t2.start();rn t3.start(); rn t4.start(); rn rn rn rnrnclass Wait rn private int counter = 0; rn private String name = null; rn public Wait(int counter,String name) rn this.counter = counter; rn this.name = name; rn rn rn public synchronized void doSomthing() rn int tempCounter = --counter; rn if(tempCounter <= 0) rn customizedNotifyAll(); rn rn else rn rn while(tempCounter > 0) rn try rn System.out.println(Thread.currentThread().getName()+"-<"+name+tempCounter+">"+"will invoke WAIT()"); rn --tempCounter; rn wait(); rn rn rn catch (InterruptedException e) rn e.printStackTrace(); rn notifyAll(); rn rn System.out.println(Thread.currentThread().getName()+"-<"+name+tempCounter+">"+"has been ACTIVED"); rn rn rn customizedNotifyAll(); rn rn rn rn rn rn public void customizedNotifyAll() rn notify(); //可以把这句换成notifyAll(); rn System.out.println(Thread.currentThread().getName()+"-<"+name+counter+">"+"::"+"INVOKED NOTIFYALL() AND FINISHED"); rn rn rn rnrn问题:不是都说notify() 方法是随机唤醒等待的线程吗?但为什么我运行的结果每次都是一样的呢??rn运行结果始终是:rnThread-0-will invoke WAIT()rnThread-1-will invoke WAIT()rnThread-2-will invoke WAIT()rnThread-3-::INVOKED NOTIFYALL() AND FINISHEDrnThread-0-has been ACTIVEDrnThread-0-will invoke WAIT()rnrn还有把public void customizedNotifyAll()方法里的notify()语句换成notifyAll()语句,唤醒所有等待的线程,让这些线程去竞争同步资源,既然是竞争,按理说运行结果也应该是随机的才对啊,为什么我的运行结果每次又都是一样的呢?rn结果如下:rnThread-0-will invoke WAIT()rnThread-1-will invoke WAIT()rnThread-2-will invoke WAIT()rnThread-3-::INVOKED NOTIFYALL() AND FINISHEDrnThread-2-has been ACTIVEDrnThread-2-::INVOKED NOTIFYALL() AND FINISHEDrnThread-1-has been ACTIVEDrnThread-1-will invoke WAIT()rnThread-0-has been ACTIVEDrnThread-0-will invoke WAIT()rnrn
关于wait和notify方法
初学线程,对于一些问题不是很明白,请看下面的示例:rnpublic class WaitAndNotifyAndSynchronizedrnrn public WaitAndNotifyAndSynchronized()rn final WaitAndNotifyAndSynchronized a = this;rn Thread th1 = new Thread() rn @Overridern public void run()rn tryrn rn this.sleep(3000); rn catch (InterruptedException e)rn rn // TODO Auto-generated catch blockrn e.printStackTrace();rn rn while(true)rn synchronized (a) //①rn System.out.println(this);//②rn a.notify();rn rn rn rn ;rn th1.setDaemon(true);//这句也是必须的,将th1设为守护线程,保证在唤醒a以后,所有活动的线程都为守护线程,jvm能及时退出rn th1.start();//③ 和a.run的顺序不可以换 rn this.run();rn rn rn rn public static void main(String[] args)rn rn new WaitAndNotifyAndSynchronized();rn rn rn public void run()rn rn /**rn * 这里可以换成这样,直接锁住this就行了rn */rn synchronized (this)rn rn tryrn rn rn this.wait();//阻塞当前的线程并释放锁rn catch (InterruptedException e)rn rn // TODO Auto-generated catch blockrn e.printStackTrace();rn finallyrn System.out.println("1");//执行finallyrn rn rn rn rn rn rnrn1.关于①处,为什么notify和wait方法必须要同步,难道就是因为api里强制的规定吗?rn2关于②处,最后的执行结果是不停的输出这里然后虚拟机退出,我的理解是notify之后此时就剩守护线程了,应该结束了,怎么还会不停的输出这里rn3关于③处,为什么和a.run()不能换位置,对换执行的结果是什么都不输出,虚拟机不退出
为什么wait,notify,notifyAll定义在Object中?
这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法。回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类...
Object对象方法之wait与notify
Object对象方法之wait与notify 本文首发于https://www.jianshu.com/p/18769b7dc46f 道生一,一生二,二生三,三生万物。 老子《道德经》 Java是单继承模型,有类似于老子的道德经的哲学,所有的类最终都会继承自一个原始类,这个类就是Object。 Object对象中总共有11个可供protect或public方法。除去toSt...
关于j2me线程wait() 和notify()
现在写了一个程序,里面有两个按钮,暂停,继续,要求在他本身的这个类中实现暂停,继续功能,这个类继承gamecanvas,rn现在本人确定是写一个boolean ispause,暂停按钮ispause=true ,继续ispause=false;在run方法中[code=Java]rnwhile(true)rnif(ispause)rnrnpause();rnrnrnrnif(!ispause)rnwakeup();rnrnrnrn[/code]rnrn现在的问题时,最开始的时候ispause是false的,这样的话就会一直进入wakeup()方法,就产生问题了,怎么才能只进入一次wakeup()方法呢,可不可以另写一个类,监听当前这个类的活动状态呢
大话Object类里面的方法
用自己通俗的语言来解释Object类的方法 registerNatives() private static native void registerNatives(); static { registerNatives(); } 这个方法的作用是将Object类里面的本地方法(native修饰的)进行注册,注册完以后就会生成一个java本地方法名–&gt...
类为什么放在头文件里不行
类为什么放在头文件里不行,而将同样的代码放在一个cpp文件下就行了。
Object类为什么有toString()方法?
rn昨天,总监问了这样一个问题:rnrn问什么Object类要有toString()方法?rnrn这是面向对象的一个知识,可是究竟为什么呢?rnrn请大家帮忙解释!!
wait(),notify(),notifyAll()用来操作线程为什么定义在Object类中
a、这些方法用于同步中 b、使用这些方法时必须要标识所属的同步的锁 c、锁可以是任意对象,所以任意对象调用的方法一定是定义在Object类中
Object类的equals方法
Object类是所有对象的子类,只要是对象就继承了equals方法,equals方法可以重写。 但是记住传入的参数应该是对象类型的,当比较两个对象的成员变量时,应该注意用向下转型,相当于c++中的类型强制转换 关键字instanceOf,如:obj instanceOf Demo,obj是Demo类的对象么? toString方法,返回的是String类型的,类名(对象所属的那个类)...
Object类相关方法
1.equals 实现对非null对象的等价关系判断 自反性,对于任何非null引用对象x,x.equals(x)=true 对称性,对于任何非null引用对象x和y,x.equals(y)=y.equals(x) 传递性,对于任何非null引用对象x,y和z,如果x.equals(y),y.equals(z),则x.equals(z) 一致性,对于任何非null引用对象x和y,多次调用x....
Object类的方法
Object类是java所有类的祖先类。 Object类的方法有:
Object类的常见方法
hashCode:默认返回System.identityHashCode()方法的值,是对象的内存地址equals:默认比较两个对象的内存地址是否相等getClass:返回对象所指向的类wait:在synchronized同步块中使用,表示线程释放资源并进入等待notify / notifyAll:在synchronized同步块中使用,表示唤醒一个/所有等待线程toString:不解释final...
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数