练习题之Wait/Notify

方案一:

public class PrintABC {
  public static void main(String[] args) {
    AtomicInteger synObj = new AtomicInteger(0);
    Runnable r = new ThreadModel(synObj);
    new Thread(r,"A").start();
    new Thread(r,"B").start();
    new Thread(r,"C").start();
  }
}

public class ThreadModel implements Runnable {
 public volatile AtomicInteger ato;

 public ThreadModel(AtomicInteger ato) {
    this.ato = ato;
 }

 public void run() {
  for(int i=0;i<10;i++) {
    synchronized(ato) {
      if(ato.get()%3==0) {
         System.out.println("A);
         ato.set(ato.get()+1);
         ato.notifyAll();
      } else if(ato.get()%3==1) {
         System.out.println("B);
         ato.set(ato.get()+1);
         ato.notifyAll();
      } else if(ato.get()%3==2) {
         System.out.println("C);
         ato.set(ato.get()+1);
         ato.notifyAll();
      } else {
         ato.wait();
      }
    }
  }
 }
}

方案二:

public class printABC {

 public static void main(String [] args) {
   AtomicInteger ato = new AtomicInteger(0);
   ThreadModel modelA = new ThreadModel(ato,"A",0);
   ThreadModel modelB = new ThreadModel(ato,"B",0);
   ThreadModel modelC = new ThreadModel(ato,"C",0);
   new Thread(modelA).start();
   new Thread(modelB).start();
   new Thread(modelC).start();
 }

}

public class ThreadModel {

  private AtomicInteger ato;
  private String printChar;
  private int flag;
  private int count = 0;
  public ThreadModel(AtomicInteger ato,String printChar,int flag) {
    this.ato = ato;
    this.printChar = printChar;
    this.flag = flag;
  }

 public void run() {
    synchronized(ato) {
       while(true) {
          if(ato.get()%3==flag) {
             System.out.println(printChar);
             ato.set(ato.get()+1);
             ato.notifyAll();
             count++;
             if(count==10) {
                break;
              }
          }else {
             ato.wait();
          }
       }
    }
 }

}
时间: 2024-10-24 08:16:15

练习题之Wait/Notify的相关文章

多线程练习题

多线程练习题 编写程序实现,子线程循环3次,接着主线程循环5次,接着再子线程循环3次,主线程循环5次,如此反复,循环3次 第一种实现方式:使用synchronized关键字 ?package com.aaa.test;?public class Test1 {?   private boolean flag=false;?//   主线程要实现的功能   public synchronized void mainFunction(){?       while (!flag){        

notify 文件系统监控

notify notify一种强大的.细粒度的.异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性.读写属性.权限属性.删除创建移动等操作,也就是可以监控文件发生的一切变化,我们可以利用内核提供的这个属性,在文件发生任何变化时都触发rsync同步动作,这样就做到数据的实时同步了.

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态.然后等待消费者消费了商品,然后消费者通知生产者队列有空间了.同样地,当

[Lab4-1]抓路由练习题

[Lab4-1]抓路由练习题 问题1: 用ACL抓取172.18.0.0/16----172.29.0.0/16的路由 答案: 172.16.0.0 0.15.255.255,看上去很完美,但实际上框的范围有些大. R1(f0/0)-(f0/0)R2 R1上的接口地址: R1#sh ip int b Interface IP-Address OK? Method Status Protocol FastEthernet0/0 12.1.1.1 YES NVRAM up up Loopback0

VBS练习题

练习题: 1.输入3个数,输出其中最大的那个值. Option Explicit Dim intA,intB,intC intA=CInt(InputBox("请输入a:")) intB=CInt(InputBox("请输入b:")) intC=CInt(InputBox("请输入c:")) If intA>intB And intA>intC Then MsgBox "最大值是:"&intA ElseIf

hdu 1166:敌兵布阵(树状数组,练习题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 37773    Accepted Submission(s): 15923 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就

1007 数字逻辑练习题

1007: 数字逻辑练习题 时间限制: 1 Sec  内存限制: 128 MB提交: 264  解决: 59[提交][状态][讨论版] 题目描述 原码.反码.补码都是一样的,都是正数本身.  对于负数: 原码是符号位为 1,数值部分取绝对值的二进制. 反码是符号位为 1,其它位是原码取反. 补码是符号位为 1,其它位是原码取反,未位加 1.  输入一个 64bit 十进制整数,输出它的原码,反码,补码的 16 进制表示法 输入 有多组数据,每组数据一行,为一个 64bit 十进制整数,包含正负符

【Java多线程通信】syncrhoized下wait()/notify()与ReentrantLock下condition的用法比较

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6556925.html  一:syncrhoized使用同一把锁的多个线程用通信实现执行顺序的调度 我们知道,使用syncrhoized关键字修饰一个代码块.一个方式时,在代码块.方法执行完毕之前是不会释放掉所持有的锁的,在执行期间,其他申请这个锁的线程只能阻塞等待.这些等待的线程被安排在一个等待队列中. 现在,由于某种原因,在当前同步代码块A中需要另一个同步代码块B先执行完,然后A才能继续进行下去.而同步代

算法--三色排序练习题

三色排序练习题 第17节 三色排序练习题 有一个只由0,1,2三种元素构成的整数数组,请使用交换.原地排序而不是使用计数进行排序. 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组.保证数组大小小于等于500. 测试样例: [0,1,1,0,2,2],6 返回:[0,0,1,1,2,2] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class ThreeColor { 4 public int[] sortTh