黑马程序员技术交流社区

标题: 40个线程同时跑起和谐操作4个类的4个对象 [打印本页]

作者: slatop@qq.com    时间: 2013-6-13 17:15
标题: 40个线程同时跑起和谐操作4个类的4个对象
  好TM难写。花了半天的时间。能把这个看懂基本你多线程没问题了。太累了很多地方没加注释
  1. package com.heima.Demo;

  2. public class Demo{

  3.         public static void main(String[] args) throws InterruptedException {
  4.                 //创建描述动物行为的对象
  5.                 AnimalDescribe animal = new AnimalDescribe();
  6.      
  7.                 //鸟类与鱼类分两个线程循环向动物描述对象中添加描述信息
  8.                 Fish fish = new Fish(animal);
  9.                 Bird brid = new Bird(animal);
  10.                 Beast beast = new Beast(animal);
  11.       
  12.                 for (int i = 0; i <= 10; i++) {
  13.                         new Thread(fish).start();
  14.                         new Thread(brid).start();
  15.                         new Thread(beast).start();
  16.                         new Thread(animal).start();
  17.                 }
  18.                 animal.flag = 1;
  19.                 synchronized (animal) {
  20.                         animal.notifyAll();
  21.                 }
  22.     }
  23. }

  24. //动物描述类,主要用来描述一个类动物的行为
  25. class AnimalDescribe implements Runnable{
  26.         int flag = 100;
  27.         private int runCount = 45;
  28.         private String typeName;//动物的种类
  29.         private String action;  //动物的行为

  30.         public String getTypeName() {
  31.                 return typeName;
  32.         }

  33.         public void setTypeName(String typeName) {
  34.                 this.typeName = typeName;
  35.         }

  36.         public String getAction() {
  37.                 return action;
  38.         }

  39.         public void setAction(String action) {
  40.                 this.action = action;
  41.         }

  42.         //打印当前动物的种类和对应的行为
  43.         public synchronized void print(){
  44.                 try {
  45.                         while (flag != 0) wait();
  46.                        
  47.                         System.out.println(Thread.currentThread().getName() + "\t--显示--" + typeName + ":" + action);
  48.                        
  49.                         if (typeName.equals("鸟")) {
  50.                                 flag = 2;
  51.                         }
  52.                         else if (typeName.equals("鱼")) {
  53.                                 flag = 3;
  54.                         }
  55.                         else if (typeName.equals("兽")) {
  56.                                 flag = 1;
  57.                         }
  58.                        
  59.                         notifyAll();

  60.                        

  61.                        
  62.                 } catch (InterruptedException e) {
  63.                         // TODO Auto-generated catch block
  64.                         e.printStackTrace();
  65.                 }
  66.         }

  67.         @Override
  68.         public void run() {
  69.         // TODO Auto-generated method stub
  70.                 while (true) {
  71.                         print();
  72.                 }
  73.         }
  74. }
  75. abstract class Animal implements Runnable {
  76.         public AnimalDescribe animal = null;//保存一个动物描述对象
  77.         public int runCount = 15;
  78.        
  79.         public Animal(AnimalDescribe animal) {

  80.                 this.animal = animal;
  81.         }
  82.        
  83.         public void addData(int index, String typeName, String action){
  84.                
  85.                 try {
  86.                                 while (animal.flag != index) animal.wait();
  87.                                
  88.                                 animal.setTypeName(typeName);
  89.                                 animal.setAction(action);
  90.                                 System.out.println(Thread.currentThread().getName() + "\t-添加数据完成!");
  91.                                 animal.flag = 0;
  92.                                 animal.notifyAll();
  93.                 } catch (InterruptedException e) {
  94.                         // TODO Auto-generated catch block
  95.                         e.printStackTrace();
  96.                 }   
  97.                
  98.         }
  99. }
  100. //鸟类
  101. class Bird extends Animal {
  102.        
  103.         public Bird(AnimalDescribe animal) {       
  104.                 super(animal);
  105.         }

  106.         @Override
  107.         public void run() {
  108.         // TODO Auto-generated method stub
  109.                  while(true){
  110.                           synchronized (animal) {
  111.                                   addData(1, "鸟", "在天上飞!");                       
  112.                         }
  113.                  }
  114.         }
  115. }

  116. //鱼类
  117. class Fish extends Animal {

  118.         public Fish(AnimalDescribe animal) {
  119.                 super(animal);
  120.         }

  121.         @Override
  122.         public void run() {
  123.         // TODO Auto-generated method stub
  124.                  while(true){
  125.                           synchronized (animal) {
  126.                                   addData(2, "鱼", "在水里游!");       
  127.                         }
  128.                 }
  129.         }
  130. }

  131. //兽类
  132. class Beast extends Animal {

  133.         public Beast(AnimalDescribe animal) {
  134.                 super(animal);
  135.         }

  136.         @Override
  137.         public void run() {
  138.         // TODO Auto-generated method stub
  139.                  while(true){
  140.                           synchronized (animal) {
  141.                                   addData(3, "兽", "在地上跑!");
  142.                         }
  143.                 }
  144.         }
  145. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2