javaewait的简单介绍

博主:adminadmin 2023-01-07 23:48:08 367

本篇文章给大家谈谈javaewait,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java wait的用法

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

//Thread 1

try{

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

}

catch(InterrputedException e) {

}

JAVA wait()问题

用无限循环有问题,因为结束不了的。

通常应该判断队列是否为空了,或者是否还有生产者。

也可以通过设置消费者的线程为daemon线程来实现消费者自动退出。

但wait不会出错的。因为Wait只是在等待其他人获取锁变量并唤醒自己,至于到底有没有人来唤醒他,就不管了,死等的。。。

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

            }

        }

        

        

    }

    

}

java里面的wait方法(object类中的)和sleep()方法有什么本质上的区别,详解1··

首先,sleep()是Thread类中的方法,而wait()则是Object类中的方法。

sleep()方法导致了程序暂停,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。

wait()方法会导致线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

以下以代码为例讲解:

package test;

public class WaitAndSleep {

public static void main(String[] args) {

new Thread(new Thread1()).start();

try {

Thread.sleep(5000);

} catch (Exception e) {

e.printStackTrace();

}

new Thread(new Thread2()).start();

}

private static class Thread1 implements Runnable {

@Override

public void run() {

synchronized (WaitAndSleep.class) {

System.out.println("thread1 is waiting...");

try {

// 调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池

WaitAndSleep.class.wait();

} catch (Exception e) {

e.printStackTrace();

}

System.out.println("thread1 is going on ....");

System.out.println("thread1 is over!!!");

}

}

}

private static class Thread2 implements Runnable {

@Override

public void run() {

synchronized (WaitAndSleep.class) {

System.out.println("enter thread2....");

System.out.println("thread2 is sleep....");

// 只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

WaitAndSleep.class.notify();

// ==================

// 区别

// 如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()

// 方法,则线程永远处于挂起状态。

try {

// sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,

// 但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

// 在调用sleep()方法的过程中,线程不会释放对象锁。

Thread.sleep(5000);

} catch (Exception e) {

e.printStackTrace();

}

System.out.println("thread2 is going on....");

System.out.println("thread2 is over!!!");

}

}

}

}

运行结果:

thread1 is waiting...

enter thread2....

thread2 is sleep....

thread2 is going on....

thread2 is over!!!

thread1 is going on ....

thread1 is over!!!

如果我们把代码:WaitAndSleep.class.notify();给注释掉

运行结果:

thread1 is waiting...

enter thread2....

thread2 is sleep....

thread2 is going on....

thread2 is over!!!

程序一直处于挂起状态,无法结束

关于javaewait和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。