导航:首页 > 编程语言 > threadjavawait

threadjavawait

发布时间:2022-02-28 08:17:31

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方法

  1. wait和notify是用在多线程竞争同一锁资源的情况下使用的。

  2. 你这段代码实际是个单线程,这个线程自己把自己阻塞了,自然不可能自己把自己唤醒。

  3. 你的意图怎么实现呢?需要加入另外一个线程,下面是我仿照你的意图写的一段代码,供参考下



  4. 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了,很明显的

阅读全文

与threadjavawait相关的资料

热点内容
优信二手车解压后过户 浏览:63
Windows常用c编译器 浏览:780
关于改善国家网络安全的行政命令 浏览:835
安卓如何下载网易荒野pc服 浏览:656
javainetaddress 浏览:106
苹果4s固件下载完了怎么解压 浏览:1005
命令zpa 浏览:288
python编译器小程序 浏览:946
在app上看视频怎么光线调暗 浏览:542
可以中文解压的解压软件 浏览:595
安卓卸载组件应用怎么安装 浏览:915
使用面向对象编程的方式 浏览:342
程序员项目经理的年终总结范文 浏览:932
内衣的加密设计用来干嘛的 浏览:435
淮安数据加密 浏览:295
魔高一丈指标源码 浏览:984
松下php研究所 浏览:171
c回调java 浏览:403
梦幻端游长安地图互通源码 浏览:747
电脑本地文件如何上传服务器 浏览:315