`
anson_xu
  • 浏览: 502436 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

Java 线程中的Join、wait、notify,sleep【转】

阅读更多

   
Java 线程中的Join、wait、notify,sleep【转】
1.wait和notify
这两个方法都是Object中的方法,放在一块是因为他们关系非常密切.
wait就是等待这个对象的同步锁,不过调用这个方法必须先获得这个对象的同步锁,就这一点很多人就搞晕了.
这里先解释一下这两个方法,然后给出一个小例子说明.
wait:等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则后收到一个 IllegalMonitorStateException,这个是运行时异常.调用这个方法后,就放弃了这个同步锁了.如果不带参数的wait方法就只 有等别人唤醒了,如果带一个参数的
化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.
notify:唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),但是notifyAll可以唤醒所有等待的线程,注意唤醒的时在notify之前wait的线程,之后的没有效果.
这里举一个通俗的例子,两个人共有一个卫生间(每次只能一个人用),他们都要刷牙和方便,他们是这样约定的,轮流用,第一个人先刷牙,然后第二个人刷牙...
 
class Syn
{
        public static void main(String[] args) throws Exception
        {
            TwoPeople.ONE.start();
            TwoPeople.TWO.start();
        }
}
class TwoPeople extends Thread
{
    private int i=0;
    static Thread ONE=new TwoPeople(1);
    static Thread TWO=new TwoPeople(2);
    static Object washroom=new Object();  
    private TwoPeople(int i){this.i=i;}
    public void run(){
        synchronized(washroom){
            try{
                if(i==1){
                    brush(); //1
                  washroom.wait(); //2
                    release(); //6 
                    washroom.notify(); //7
                }
            else{
                    brush(); //3
                    washroom.notify(); //4
                    washroom.wait(); //5
                    release(); //8
            }
            }catch(InterruptedException e){e.printStackTrace();}
        }
    }
    private void brush() {
            System.out.println("People "+i+" is brushing !");
             try{Thread.sleep(2000);}catch(InterruptedException e){e.printStackTrace();}
            //延迟两秒看效果
            System.out.println("People "+i+" has burshed !");
    }
    private void release(){
            System.out.println("People "+i+" is releasing !");
            try{Thread.sleep(2000);}catch(InterruptedException e){e.printStackTrace();}
            //延迟两秒看效果
            System.out.println("People "+i+" has released !");
    }
};
People 1 is brushing !
People 1 has burshed !
People 2 is brushing !
People 2 has burshed !
People 1 is releasing !
People 1 has released !
People 2 is releasing !
People 2 has released !
上面的代码很简短,而且表明了执行顺序,至于join和sleep还是下次再讨论吧.

分享到:
评论

相关推荐

    线程学习小Test

    Java线程 wait notify sleep join 同步实现Demo

    java线程分析java project例子

    java线程分析java project例子,里面分析了sleep(),join(),yield()和wait以及notify等方法的使用以及需要注意的地方。

    java线程学习笔记

    1.9 加入线程(join) 8 1.10 捕获异常(UncaughtExceptionHandler) 9 1.11 线程与任务 10 1.12 让后计算 11 二 共享受限资源 12 2.1 解决共享资源(synchronized、lock) 12 2.1.1 描述synchronized 12 2.1.2 ...

    java线程分析android project例子

    java线程分析android project例子,主要分析了sleep(),join(),yield()和wait()以及notify等方法以及需要注意的事项。

    这就是标题—— JUC.pdf

    wait / sleep 并发 / 并行 Lock 使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 Condition 定制化通信 多线程锁 并发下的集合类 List Set Map ...

    JAVA多线程技术分享-39页PPT(winding)

    分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发...1,wait notify 2,volatile 3,lock 4,join 5,并发工具 CountDownLatch 四: 项目中的应用 1,线程池技术 2,实际项目中的应用 3,获取返回值等

    Java高级程序设计测试含答案.docx

    update() 在线程同步中,为了唤醒另一个等待的线程,使用下列方法 () [单选题] * A.sleep() B.wait() C.notify()(正确答案) D. join() Java高级程序设计测试含答案全文共40页,当前为第4页。Java提供以下哪个...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】sleep()和wait()分别是哪个类的方法,有什么区别? 79 【多线程】sleep()和yield()的区别 79 【多线程】对synchronized理解?用在代码块和方法上有什么区别? 80 【多线程】Volatile的理解 82 【*多线程】...

    Java语言程序设计(一)真题及答案.doc

    A.sleep() B.notify() C.wait() D.join() 正确答案:B 您的答案: 本题解析: 暂无解析 2.以下标识符中,不是Java语言关键字的是()。 A.wait B.new C.long D.switch 正确答案:A 您的答案: 本题解析: 暂无解析 3....

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    LeetCode判断字符串是否循环-java:Java

    LeetCode判断字符串是否循环 知识点总结 java基础 1、使用迭代器和for each循环查看集合元素时只能获得元素的值,不能改变元素 ...object的方法:wait(notify,notifyall),thread的方法:(sleep、join),结束

    JAVA程序设计教程

    Java程序.............................................................................................6 1.3.1 Java程序的结构 ...........................................................................

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics