Ⅰ java Thread 的 sleep 和 wait 的区别
(1)sleep是让线程休眠,必须给定休眠的时间,时间到了后自动醒来,不需要唤醒,休眠时不放弃cpu的执行权
(2)wait是让线程等待,可以给时间,也可以不等时间,但是必须要唤醒才能醒来(使用notify或者notifyAll),等待时放弃cpu的执行权
(3)sleep方法是Thread类中定义的方法,wait是Object中定义的方法
(4)wait用在同步代码块或者同步方法中,sleep可以在任何地方使用
(5)sleep必须捕获异常,wait不用捕获异常
Ⅱ java线程,wait()方法怎么把自己给停掉了
Thread.currentThread().wait() //引用当前的线程
Ⅲ java多线程关于Thread实例对象执行wait方法的问题
wait()方法只是让当前线程(t1调用的,就是t1线程)在当前时间片不抢占cpu,但下一个时间片该抢还是抢
正常都是子线程执行完,主线程才继续执行,所以t1执行完,主线才会执行,而且是没有障碍地执行
最后你那个同步锁没什么用,因为没有线程跟主线程抢着执行同步块里的内容
Ⅳ Java Thread BLOCKED和WAITING两种状态的区别
BLOCKED状态
线程处于BLOCKED状态的场景。
当前线程在等待一个monitor lock,比如等待执行synchronized代码块或者使用synchronized标记的方法。
在synchronized块中循环调用Object类型的wait方法,如下是样例
synchronized(this)
{
while (flag)
{
obj.wait();
}
// some other code
}
WAITING状态
线程处于WAITING状态的场景。
调用Object对象的wait方法,但没有指定超时值。
调用Thread对象的join方法,但没有指定超时值。
调用LockSupport对象的park方法。
提到WAITING状态,顺便提一下TIMED_WAITING状态的场景。
TIMED_WAITING状态
线程处于TIMED_WAITING状态的场景。
调用Thread.sleep方法。
调用Object对象的wait方法,指定超时值。
调用Thread对象的join方法,指定超时值。
调用LockSupport对象的parkNanos方法。
调用LockSupport对象的parkUntil方法。
Ⅳ java线程wait(),notify()问题,以下是代码
把生产者的run方法这样写:
public void run() {
int n = 0;
while (n <= 10) {
n++;
q.put(n);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其实没什么特殊的,我只似乎让生产者每次生产出来一个东西之后稍稍睡一会,然后你在run一下看看效果,应该是每隔1s就会输出一次,一共11次。
你的代码本身没有问题,问题在于要知道当put方法里面notify的时候,你不会知道它会唤醒那个线程,这个完全是jvm看自己心情决定的,那么就会出现的情况是生产者跑的飞快,它可能一下子就把11次循环都跑完,然后最后一次notify完了之后以后都不会在notify了,剩下一个消费者可怜巴巴的wait,可是永远不会有人notify他了,然后就over了。
可能你不是很明白我说的意思,你按照我说的把代码改一下,然后自己思考一下,这个东西会有一个顿悟的过程,可能你一时想不明白,但是将来可能一下子就明白我的意思了。
BTW,java多线程其实还是比较复杂的,让各个线程在你的脑子里面跑起来,你如果能在自己脑子里面模拟多个线程一起跑,你就会比较容易想明白。
另外,多线程的代码debug不能给你提供什么帮助,我也有同事喜欢用debug调试多线程的程序,我对此颇为不屑,因为如果你在run里面设置了断点,那么我可以说,你永远都不会知道多线程是怎么回事,一定要在自己脑子里面想才行,实际上我让线程sleep一会实际上相当于是加一个1s的断点,1s后断点取消,程序继续跑,这个可以帮助你理解。
Ⅵ java thread wait问题
public class ThreadTest {
public static void main(String[] args) throws Exception{
Thread t = Thread.currentThread();
for(int i =0;i<20;i++){
if(i==12){
synchronized (t) {
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println("main---->"+i);
}
}
}
你用这代码试试
你搞错对象了
Ⅶ JAVA线程wait()方法问题
应该使用wait(),wait 方法的解释是
Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
举个例子:
比如你有一个Depository 类的对象 d ,然后线程A要访问d的addLast()方法,
因为这个addLast()方法时synchronized 所以线程A进入的时候就给这个对象d 加上锁,其它线程不允许访问,当执行到wait()时,线程A就会先打开对象A的锁,并在对象d 外面排队等待。
对于IllegalMonitorStateException,我的理解是:
一个对象的wait()方法只能在此对象的同步方法中被调用,意思是,这个对象在wait前是被加了锁的。
你将addLast方法的synchronized 去掉运行也会抛出这样的异常。
所以说你用wait()就可以了。
Thread.currentThread().wait();这句话调用的是当前线程对象的wait()方法,
当前线程对象没有被加锁。所以出错。
个人理解,仅供参考,希望能帮到你
Ⅷ java 的 Thread.sleep() 和 Thread.wait() 的区别
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
Ⅸ java线程wait方法
wait和notify是用在多线程竞争同一锁资源的情况下使用的。
你这段代码实际是个单线程,这个线程自己把自己阻塞了,自然不可能自己把自己唤醒。
你的意图怎么实现呢?需要加入另外一个线程,下面是我仿照你的意图写的一段代码,供参考下
publicclassA
{
publicA(){
finalAa=this;
Threadth1=newThread(){
@Override
publicvoidrun(){
//一直循环,去尝试着唤醒a
try
{
this.sleep(10000);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//为检查是不是能真正实现唤醒a,等待10000毫秒,此时保证a已经处于等待状态中。
while(true){
/**
*用notify唤醒的线程必须是持有当前锁对象的线程
*/
synchronized(a){
a.notify();
}
}
}
};
th1.setDaemon(true);//这句也是必须的,将th1设为守护线程,保证在唤醒a以后,所有活动的线程都为守护线程,jvm能及时推出
th1.start();//和a.run的顺序不可以换
this.run();
}
publicstaticvoidmain(String[]args)
{
newA();
}
publicvoidrun()
{
/**
*这里可以换成这样,直接锁住this就行了
*/
synchronized(this)
{
try
{
this.wait();//阻塞当前的线程
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
System.out.println("1");//执行finally
}
}
}
}
Ⅹ 请教Java高人解答Java Thread,Wait的问题,问题如图,多谢,红色部分难以理解,请详解!
这是一个很明显的,线程不安全的问题
因为你在子线程里修改了这个 i 的值,也就是说,当你线程1 wait()的时候 i 的值还是大于0的
这时候线程2和线程3还是会继续循环
结果线程2和线程3又wait()了等线程2notify()的时候,i的值已经是0了结果i--
然后是线程3又notify()了,这时候i的值本来已经是-1结果是-2了,很明显的