`
luguangjin
  • 浏览: 734 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java多线程之wait,notify例子思考

阅读更多

       今天来写一篇Java关于多线程之线程通信例子。这是我学Java和工作这些年来,首次发表的博文,自己支持自己一下。

题目要求:写一个Java多线程程序,要求子线程循环输出10次,然后主线程循环输出10次,再接着子循环输出10次,再然后主线程循环输出10次。。。如此往复10次。

请大家帮我分析下,我的代码例子如下:

package org.jabari.tech.test;
public class ConcurrentTest1 {   
    class BizObj {
        //当前执行游标是否在子线程(true:子线程执行;false:父线程执行)
        private boolean cursorInSub;       
        public BizObj(boolean cursorInSub) {
            super();
            this.cursorInSub = cursorInSub;
        }
        public boolean isCursorInSub() {
            return cursorInSub;
        }
        public void setCursorInSub(boolean cursorInSub) {
            this.cursorInSub = cursorInSub;
        }       
    }
    
    
    public static void main(String[] args){
        ConcurrentTest1 t = new ConcurrentTest1();
        //创建一个锁对象,默认当前执行子线程。
        final BizObj objLock = t.new BizObj(true);
        new Thread(new Runnable(){
            public void run() {
                for(int j=0;j<10;j++){
                    synchronized(objLock) {
                        while (!objLock.isCursorInSub()) {
                            try {
                                objLock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        for (int i = 0; i < 10; i++) {
                            System.out.println(Thread.currentThread().getName()+"-loop["+j+"]-"+i);
                        }
                        objLock.setCursorInSub(false);
                        objLock.notify();
                    }
                }
                
            }
            
        },"sub").start();
        //这里其实不需要再New一个主线程执行,因为main方法本身就是一个主线程单独执行。
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
                for(int j=0;j<10;j++){
                        synchronized(objLock) {
                            while (objLock.isCursorInSub()) {
                                try {
                                    objLock.wait();
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                            for (int i = 0; i < 10; i++) {
                                System.out.println(Thread.currentThread().getName()+"-loop["+j+"]-"+i);
                            }
                            objLock.setCursorInSub(true);
                            objLock.notify();
                        }
                    
                }
//            }
//        },"main").start();       
//        System.out.println(Thread.currentThread().getName()+" Finishes!");
    }
}
 
看了不少大牛的视频讲解,JDK说明,和Thinking In Java 4th 中关于wait,notify/notifyAll的说明,
分析领悟如下:
1.    wait,notify/notifyAll是针对获得某对象同步锁的对象而言,不是对线程而言的。wait,notify/notifyAll,是所有对象都有的方法,当然线程对象也有这些方法,任何对象都有同步锁。
2.   这段代码synchronized(b) {....while(cond) { 
b.wait();
......  }的意思是什么?
   答:这是一段同步代码块,b是同步锁资源对象。“同步”表示在同一个时刻,只允许一个线程能访问b的synchronized方法.当前线程满足了cond,执行b.wait()后,当前线程便被阻塞进入了b对象的等待队列中(Waiting Queue)中,暂时释放对象b的同步锁,给其他线程获取b的同步锁的机会。线程的sleep,interrupt方法同样也会使当前线程阻塞,但他们不会释放对象锁。之所以用while()循环,是防止假唤醒现象,保证可靠性。
3.   当你不在正确的对象上使用synchronized,wait,notity,会造成java.lang.IllegalMonitorStateException,使用时,必须要是对同一个对象,执行这3个方法。
 
分享到:
评论

相关推荐

    Java多线程wait和notify

    Java多线程编程是开发高并发应用的关键技术之一,它允许程序同时执行多个任务,提高系统资源利用率。在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这...

    一个理解wait()与notify()的例子

    本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...

    java 多线程 控制按钮移动 例子

    总的来说,Java多线程提供了丰富的功能,包括线程的创建、启动、中断、同步以及异常处理等。通过合理利用这些工具,开发者可以构建出高效、稳定且响应迅速的多线程应用程序。在实际编程中,要特别注意线程安全和性能...

    Java 同步方式 wait和notify/notifyall

    总结一下,`wait()`, `notify()`, 和 `notifyAll()` 是Java多线程编程中的核心工具,它们与`synchronized`关键字一起,为线程间的协作提供了强大的支持。理解并熟练掌握这些概念,对于编写高效、安全的多线程程序至...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    JAVA多线程的一个带UI界面的例子

    在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。

    Java多线程的小例子——吃包子

    这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...

    Java多线程实现异步调用实例

    总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...

    java多线程设计wait[参考].pdf

    Java中的多线程设计涉及到许多核心概念,其中wait/notify机制是实现线程间通信和协作的关键工具。这个机制主要用于解决资源的分配和同步问题,它依赖于Java的内置锁机制,即`synchronized`关键字和对象锁。 首先,...

    java中线程的应用例子

    3. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,但它们必须在`synchronized`代码块中使用,否则会抛出异常。 4. **线程状态**:Java线程有五种状态:新建、可运行、运行、阻塞和...

    Java多线程管理示例

    下面我们将深入探讨Java多线程的核心概念、同步机制、死锁问题以及wait/notify机制,以"生产者与消费者"的例子来具体阐述。 首先,了解Java中的线程。线程是操作系统分配CPU时间的基本单位,每个线程都有自己的程序...

    Java多线程编程详解

    ### Java多线程编程详解:深入理解与实践 #### 一、理解多线程机制 多线程,作为现代编程语言的重要特性之一,允许在单一应用程序内并发执行多个任务,从而极大提升了程序的效率和响应速度。在Java中,多线程的...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    wait_notify_demo

    在Java编程中,多线程是处理并发执行任务的关键技术之一。`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用...

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    JAVA多线程编程(详细操作例子)(低分分享).doc

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在Java中,多线程可以通过两种主要方式实现:继承`Thread`类和实现`Runnable`接口。 **继承Thread类**: 当你创建一个新的...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    java多线程经典讲义

    Java多线程是Java编程中一个非常重要的领域,它允许程序在同一时间执行多个任务,从而提高了效率和资源利用率。在Java中,线程是进程中的一个执行单元,每个进程至少包含一个线程,通常Java虚拟机(JVM)启动时会...

Global site tag (gtag.js) - Google Analytics