「java线程的wait(」java线程的wait状态和block状态的区别

博主:adminadmin 2023-01-19 03:09:07 314

本篇文章给大家谈谈java线程的wait(,以及java线程的wait状态和block状态的区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

谁能帮我解释一下java线程中的wait()方法的作用与执行原理非常感谢!

wait()方法是java.lang.Object类韦线程提供的用于实现线程间通信的同步控制方法。wait()方法使当前线程主动释放互斥锁,并进入该互斥锁的等待队列。(也就是说,它使当前线程暂停执行,等待其他线程执行notify()方法或者notifyall()方法后再继续执行本线程。)本方法用于释放一个项目的线程,唤醒另一个可能在等待的线程。有两种调用格式:

1.wait()等待通信线程唤醒后再继续执行本线程。

2.wait(long millis)等待通信线程唤醒或者最多等待millis毫秒后,再继续执行本线程。

我知道的就这么多了哈,希望对你能有一点帮助哦~~

java多线程 sleep和wait的区别

sleep()和wait()方法的最大区别是:

sleep()睡眠时,保持对象锁,仍然占有该锁;

而wait()睡眠时,释放对象锁。

但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。

java线程wait方法

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

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

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

public class A

{

    public A(){

        final A a = this;

        Thread th1 = new Thread(){

            @Override

            public void run(){

                //一直循环,去尝试着唤醒a

                try

                {

                    this.sleep(10000);

                } catch (InterruptedException e)

                {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }//为检查是不是能真正实现唤醒a,等待10000毫秒,此时保证a已经处于等待状态中。

                while(true){

                    /**

                     * 用notify唤醒的线程必须是持有当前锁对象的线程

                     */

                    synchronized (a){

                        a.notify();

                    }

                }

            }

        };

        th1.setDaemon(true);//这句也是必须的,将th1设为守护线程,保证在唤醒a以后,所有活动的线程都为守护线程,jvm能及时推出

        th1.start();//和a.run的顺序不可以换

        this.run();

    }

    

    public static void main(String[] args)

    {

        new A();

    }

    public void run()

    {

        /**

         * 这里可以换成这样,直接锁住this就行了

         */

        synchronized (this)

        {

            try

            {

                

                this.wait();//阻塞当前的线程

            } catch (InterruptedException e)

            {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }finally{

                System.out.println("1");//执行finally

            }

        }

        

        

    }

    

}

android java 线程 wait()函数

简单说wait必须显示用代码唤醒。

wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如:

//Thread 1

try{

obj.wait();//suspend thread until obj.notify() is called

}

catch(InterrputedException e) {

}

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,肯定不会报错了。

java中wait方法是什么意思

wait方法用在 synchronized 方法或者 synchronized块中。

一般在判断语句中,如果某条件被触发,让当前线程wait并释放对象的锁。

此时可以让其他线程可以对用以对象调用synchronized方法。

直到调用 notify或者notifyAll后 wait的线程才有可能执行。

所以一般wait 和 notify是成对出现的。

有点复杂,去看看线程同步有关的东西吧。

java线程的wait(的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java线程的wait状态和block状态的区别、java线程的wait(的信息别忘了在本站进行查找喔。