A. 谁能帮我解释一下java线程中的wait()方法的作用与执行原理非常感谢!
wait()方法是抄java.lang.Object类韦线程提供的用于实现线程间通信的同步控制方法。wait()方法使当前线程主动释放互斥锁,并进入该互斥锁的等待队列。(也就是说,它使当前线程暂停执行,等待其他线程执行notify()方法或者notifyall()方法后再继续执行本线程。)本方法用于释放一个项目的线程,唤醒另一个可能在等待的线程。有两种调用格式:
1.wait()等待通信线程唤醒后再继续执行本线程。
2.wait(long millis)等待通信线程唤醒或者最多等待millis毫秒后,再继续执行本线程。
我知道的就这么多了哈,希望对你能有一点帮助哦~~
B. java中wait方法是什么意思
wait方法用在 synchronized 方法或者 synchronized块中。
一般在判断语句中,如果某条件被触发,让当前线程wait并释放对象的锁。
此时可以让其他线程可以对用以对象调用synchronized方法。
直到调用 notify或者notifyAll后 wait的线程才有可能执行。
所以一般wait 和 notify是成对出现的。
有点复杂,去看看线程同步有关的东西吧。
C. Java线程wait问题
java的每一个实例对象都有一个等待队列和一个对象锁,任何一个线程要想调用该对象的wait()方法进入该对象的等待队列,就必须先通过synchronized()方法获得当前对象的锁,先说你的第一个问题,两个线程通过synchronized()方法获得的是str对象的锁,但是你在调用wait()方法的时候,默认情况下调用的是this对象的wait()函数,但是当前线程并没有获得this对象的锁,当然会报错,如果我没猜错,改成this.str.wait()和this.str.notifyAll()应该就会好了。第二个问题,也是这样,你确实获得了 锁,但是注意,你获得的是str对象的锁,不是this对象的锁,所以在你调用notifyAll()方法的时候,会出现一个异常,因为你调用的是this对象的notifyAll()方法,而this对象的等待 队列压根就是空的,因为没有任何一个线程获得它的对象锁,所以才会报错,当然了,你把synchronized()方法的参数改成this,肯定不会报错了。
D. java 多线程的方法问题 join(); sleep();wait();这些方法有什么区别这样看好像都是阻塞啊
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监版控状态依然保持,到权时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
join就是阻塞调用线程,直到该线程结束后,调用线程才能继续执行。
强制运行join后的线程。
E. JAVA中线程同步方法有哪些
JAVA中线程同步的概念在同一个线程运行 前面的运行完在运行后面的 有先后顺序 ,简单的讲就是版像排队一样有权先后顺序。
同步的方法有下面3种;
1,wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
2 notify方法和notifyAll方法:
notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
3。 synchronized关键字:
synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
根据项目的需求,选择有哪一种方法好一些。
F. Java多线程 为什么加了wait()函数 运行结果就和想象中的不同了
根据原理:通过对一个线程调用wait()函数后,线程就进入停滞状态。通过调用notify()可以唤起线程。
没有注销wait时的代码流程如下
write线程流程:
1、如果ThreadDmeo.hasdate == false,将线程停滞;
2、如果ThreadDmeo.hasdate == true,输出一个随机数,并将ThreadDmeo.hasdate设置为false,再将线程唤醒。
read线程流程如下:
1、如果ThreadDmeo.hasdate == true,将线程停滞;
2、如果ThreadDmeo.hasdate == false,读取ThreadDmeo.date,并将ThreadDmeo.hasdate设置为true。
从上面流程可以看出,只要被设置为停滞,线程A(假设为两线程中的任意一个)就不会被再次拉起。虽然这个时候,另外一个线程B可能将ThreadDmeo.hasdate标志重置,但并没有使用notify函数通知线程A启动。因此,最终两个线程都会停滞,因此当然只能读写一个数了。