`

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从入门到精通:...

    Step by StepLinux C多线程编程入门(基本API及多线程.pdf

    Step by StepLinux C多线程编程入门(基本API及多线程.pdf

    Java-Threads-Step-By-Step

    Java线程循序渐进:概述 进程与线程 ################################################ ################################ 第1节-创建线程 ################################################ ####################...

    多线程下载技术论文.rar

    3.1 JAVA中的多线程与线程安全 6 3.1.1 Java中的多线程 6 3.1.2 Java中的线程安全 7 3.2 HTTP协议简介 8 3.3 断点续传原理 8 4 需求分析 10 4.1用户需求分析 10 4.2 业务流分析 11 5. 整体设计 11 5.1 系统...

    Android异步多线程加载图片

    how to use my jar to download images Demo,just use about 4 line code to compete download image fastest and your application will run smoothly // download image in normal not fit Adapter Mode // step...

    Delphi使用MainThreadWake解决多线程输出同步实例

    摘要:Delphi源码,系统相关,线程实例  压缩包内含有两个示例,用于演示如何实现一个Delphi第三访的MainThreadWake...如果在该程序中,iMax值足够大,且step值足够小(或随机),那么就很容易导致控制台的争用(冲突)。  

    JNI技术手册 c/c++调用java

    II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 ...

    两个多线程小程序

    多线程 求质数 返回数组中的最大值 bool isPrime(long x) { if (x ) return false; if (x == 2) return true; for (long i = 2; i (sqrt((long double)x));i++) if (x%i == 0) return false; return true; } ...

    使用GDB调试多线程实例详解

    先写一段多线程程序。 makefile 加上 -g参数生成可调式信息, 可以进行调试。 pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。在gcc编译的时候,...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    原书名: Microsoft Visual C# 2010 Step by Step 原出版社: Microsoft Press 作者: (英)John Sharp 译者: 周靖 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302234289 上架时间:2010-9-6 ...

    Java测试题2答案

     } } &lt;br&gt;答案::填空第1题 x=10,a=3,b=4,c=5 填空第2题 java.util 填空第3题 (public )(static )(void)(main)(String args[]) 填空第4题 1 填空第5题

    Learn-Java-12-Programming:学习Java 12编程,由Packt发布

    探索多线程,异步,功能和React式编程 向您的应用程序添加用户友好的图形界面 找出什么是流以及它们如何在数据处理中提供帮助 了解微服务的重要性,并利用它们使您的应用程序健壮和可扩展 探索Java设计模式和最佳...

    JAVA 实现《捕鱼达人》游戏-全部源码

    3、由于每条鱼的行为不一样,所以要继承线程类,实现并发——屏幕上有多条鱼各自移动。鱼池继承JPannel,并引入自己的新的属性:鱼和鱼池。 4、类的详细设计: ``` 各个属性的说明如下: - step:鱼的移动速度 - ...

    delphi多线程超COOL示例

    step_mun: Integer; max_mun: Integer; FProgressBar: TProgressBar; FLabel: TLabel; procedure DoProgress; protected procedure Execute; override; public constructor Create(CreateSuspended: ...

    step-daemon:步进式-用于3D打印的外部计划器和步进器

    步骤守护程序 Step Daemon(步进式)是用于3d打印机的外部计划程序,该计划... 多线程管道。 双立方床水准仪具有每步精度(相对于每行)。 兼容OctoPrint。 与对Marlin的直接步进块支持一起开发。 适用于Linux(包

    64位VEH调试器,从控制台获取用户输入的命令

    //查看所有线程: ~* 查看线程1的栈: ~1 查看线程所有信息包括堆栈: ~* -a //查看进程内存属性 lmm //查看句柄!handle 查看h1 !handle h1 , !handle rcx //查看窗口lwd //resume线程 ~1 m resume all线程: ~* m //...

    PageRank算法的C实现,有和没有并行化_C语言_代码_下载

    PageRank 算法的 C 实现,有和没有并行化 包括几个文件: ...自定义调度类型(静态、动态)和线程数; step2mmap.c ,与step2.c相同,但使用 mmap; step3mmap.c ,与step3.c相同,但使用 mmap。

    基于java的黑白棋桌面应用程序源码+项目说明(课设作业).zip

    其中LocalPlayer作为AIPlayer和HumanPlayer的装饰器,在内部保存这两个类之一的一个引用,在自身的singleStep方法中,调用被装饰类对象的singleStep方法,并添加向远程发送信息的装饰代码。 4. 设置棋盘不能够接受...

    GDB调试详细命令

    GDB详细手册,文档内部分内容: //查看运行中的线程 (gdb) info thread //查看线程 (gdb) thread &lt;n&gt; //切换为线程...(gdb) set scheduler-locking off|on|step //只有当前函数,当前线程执行 完整版本请下载该手册!

Global site tag (gtag.js) - Google Analytics