`

Java线程Step By Step(Step 4)

阅读更多

(See http://www.suneca.com/article.asp?id=56

 
七,对象的wait()、notify()和notifyAll()用法
1)Object 类定义了 wait()、notify() 和 notifyAll() 方法。可以让线程相互通知事件的发生。要执行这些方法,必须拥有相关对象的锁。
2)wait() 会让调用线程休眠,直到用 Thread.interrupt() 中断它、过了指定的时间、或者另一个线程用 notify() 或 notifyAll() 唤醒它。 
3)当对某个对象调用 notify() 时,如果有任何线程正在通过 wait() 等待该对象,那么就会唤醒其中一个线程。当对某个对象调用 notifyAll() 时,会唤醒所有正在等待该对象的线程。

假如我们有两条线程,我们希望线程的输出顺序是:
线程t1输出十次
线程t2输出十次
线程t1输出十次
线程t2输出十次


那程序该如何实现?
我们的设计思路是:
使用锁的机制,首先,线程1进入可运行状态后
1)线程t1获取对象的锁
2)线程t1完成输出十个数的任务
3)唤醒其他(t2)正在等待的线程
4)自身阻塞,释放锁。
5)线程t2获取锁
6)线程t2完成输出十个数的任务
7)唤醒其他(t1)正在等待的线程
8)自身阻塞,释放锁。
9)。。。。


程序的实现如下:
 程序代码
package zizz;

/**
* 主程序. 使用wait(),notify(),notifyAll()方法
* 
* @author <a href='http://www.suneca.com'>ZIZZ</a>
*
* @Create-Time:2008-4-21 上午12:51:59
*/

public class ThreadLock {

    public static void main(String[] args) {
        //共享线程实例的线程.
        ShareRunnable share = new ShareRunnable();
        Thread t1 = new Thread(share, "t1");
        Thread t2 = new Thread(share, "t2");
        t1.start();
        t2.start();
    }

}

/**
* 
* @author <a href='http://www.suneca.com'>ZIZZ</a>
* 
* @Create-Time:2008 上午12:14:26
*/

class ShareRunnable implements Runnable {

    public void run() {
        //第一个线程运行时,对共享的线程对象进行加锁
        synchronized (this) {
            for (int i = 1; i <= 100; i++) {
                //输出当前的值
                System.out.println(Thread.currentThread().getName() + " : " + i);
                // 如果i为10的倍数
                if (i % 10 == 0) {
                    try {
                        // 唤起其他线程
                        notifyAll();
                        // 当前正在运行的线程阻塞,释放拥有该对象的锁.
                        if(i == 100)break;
                        else wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}


运行结果片断:


假如在开发的时候,并没有写上synchronized (this) {...}的同步语句,那将会出现一些问题,因为使用wait()、notify(),它需要有owner,假如没有写上这个同步语句块,那系统将会执出如下错误信息:
 程序代码
Exception in thread "t1" java.lang.IllegalMonitorStateException: current thread not owner
    at java.lang.Object.notifyAll(Native Method)
    at zizz.ShareRunnable.run(ThreadLock.java:41)
    at java.lang.Thread.run(Thread.java:595)
分享到:
评论

相关推荐

    Microsoft.Visual.C#.2010.Step.by.Step].(John.Sharp).中英文文字版

    《Visual C# 2010从入门到精通:Step by Step》以深受读者欢迎的“动手练习”(learn-by-doing exercise)风格,演示了如何、何时以及为何使用C认#快速应用程序开发环境的特性。通过《Visual C# 2010从入门到精通:...

    Visual C# Step by Step (中文版)+附带源码包

    《Visual C# Step by Step (中文版)》是一本针对初学者至中级程序员设计的教程,旨在帮助读者全面掌握Visual C#编程语言。这本书详细介绍了如何使用Microsoft的Visual Studio开发环境,尤其是针对C#语言的功能和特性...

    Assembly Language Step-By-Step - (Wiley, 2009, 0470497025).pdf

    《Assembly Language Step-by-Step: Programming with Linux》(第三版)是一本深入讲解汇编语言及其在Linux环境下的应用的专业书籍。本书由Jeff Duntemann编写,并于2009年由Wiley出版社出版。该书不仅适合初学者...

    Assembly Language Step-by-Step

    ### 《Assembly Language Step-by-Step》知识点梳理 #### 一、书籍基本信息 - **书名**:《Assembly Language Step-by-Step》 - **作者**:Jeff Duntemann - **出版社**:Wiley Publishing, Inc. - **出版年份**:...

    C# Step By Step 2010

    《C# Step By Step 2010》是一本针对初学者至中级程序员的C#编程教程,通过逐步学习的方式,全面介绍了Visual C# 2010的使用技巧和核心概念。这本书覆盖了从基础语法到高级特性的广泛主题,旨在帮助读者深入理解和...

    Microsoft Visual C# 2008 Step by step 源码及书

    《Microsoft Visual C# 2008 Step by Step》是一本专为初学者设计的C#编程教程,它深入浅出地介绍了C#语言的基础知识和.NET Framework的应用。这本书不仅涵盖了编程的基本概念,还提供了丰富的实例,使得学习者能够...

    ASP.NET 4.0Step.by.Step

    《ASP.NET 4.0 Step by Step》是一本由George Shepherd撰写的书籍,由Microsoft Press出版。本书详细介绍了最新的ASP.NET 4.0技术,并通过一系列循序渐进的教程帮助读者深入理解并掌握该技术。对于想要学习或提升ASP...

    VxWorks调试 step by step

    本文将基于提供的标题“VxWorks调试 step by step”以及描述,深入探讨VxWorks调试的过程,并结合可能包含的文档资源,如“打通VxWorks调试环境 Step by Step.doc”和“20087108422323967.pdf”,提供详尽的知识点...

    Visual C# 2010 Step By Step源码

    《Visual C# 2010 Step By Step》是一本深受程序员喜爱的教程书籍,它详细介绍了Microsoft的C#编程语言在2010版本中的使用。这本书通过一系列的实践步骤,帮助读者从零基础逐步掌握C#编程,涵盖了语言基础、面向对象...

    Java-step:一些java的东西

    7. **多线程**:Java内置对多线程的支持,Thread类和Runnable接口允许开发人员创建并发执行的任务,提高程序的效率。 8. **Swing和JavaFX**:这两个是Java的图形用户界面(GUI)库,用于构建桌面应用。Swing是老...

    VC.NET_Step_by_Step.zip_step by step

    《VC++.NET Step by Step》是一本针对微软的Visual C++ .NET编程环境的逐步学习指南。这本书通过一系列章节,详细介绍了如何使用这个强大的开发工具进行应用程序开发。压缩包中的文件名代表了书籍的不同章节,这表明...

    Microsoft Visual Basic 2008 Step by Step

    从给定的文件信息来看,我们讨论的主题是“Microsoft Visual Basic 2008 Step by Step”,这是一本由Michael Halvorson编写的书籍,由Microsoft Press出版,于2008年发行。本书旨在为读者提供逐步学习Visual Basic ...

    visual csharp 2010 step by step (从入门到精通)源码

    《Visual C# 2010 Step by Step》是一本专为初学者和有经验的开发者设计的教程,旨在帮助读者全面掌握C#编程语言及其在.NET Framework 4.0环境下的应用。这本书通过逐步指导的方式,深入浅出地讲解了C# 2010的各种...

    VC.net_Step_by_Step.rar_VC控制_step by step_vc.net MFC

    《VC++.net_Step_by_Step.rar》是一个深入学习Visual C++.net的教程资源,它旨在引导初学者从基础的控制台程序开发逐渐过渡到更高级的Windows SDK控制编程,最终掌握MFC(Microsoft Foundation Classes)框架的应用...

    Visual C# 2010 Step By Step 随书代码

    《Visual C# 2010 Step By Step》是一本专为初学者和有一定编程基础的读者设计的教程书籍,其随书代码是学习过程中的重要辅助资源。这本书旨在通过逐步指导的方式,帮助读者深入理解和掌握Visual C# 2010这门编程...

    Microsoft Silverlight 4 Step by Step.pdf

    **Microsoft Silverlight 4 Step by Step 教程详解** Microsoft Silverlight是一款由微软开发的富互联网应用程序(RIA)平台,主要用于构建和展示丰富的交互式媒体和动态Web应用程序。本教程《Microsoft ...

    vb教程 step by step

    VB教程Step by Step是针对初学者的一套详细指导,旨在帮助读者逐步掌握Visual Basic (VB)编程语言。VBScript虽然在名称中提及,但这里主要讨论的是VB,它是一种基于事件驱动的编程语言,广泛应用于Windows应用程序...

Global site tag (gtag.js) - Google Analytics