A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄嵘才 中级黑马   /  2012-12-4 14:05  /  1077 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我有问题请教:
我在某个网站见到了线程池的例子。有所获得,也有所迷惑。
有一些内容很糊涂。所以请大家多多发表关于这方面的看法。帮助我从例子的细节中学习更多。

我自认为明白和不明白的都在代码注释中标上,如果我的认识有偏差,也请指正。
如果你有更好更易明白的讲解,或例子也请分享下吧。
先谢谢大家。
用例
一个厕所有3个,人们不停的进厕所做enen的事情.排量随机,蹲坑时间随机.  厕所的容量(capacity)为100, 当厕所的排量(volume)超过容量的时候, 通知清洁工来清洁. 清洁过程中不能再放新人进来. 厕所每天只服务100个人,然后停业.
本例中有4个类:
ThreadPool - main函数入口类.
Toilet - 厕所, 它使用一个具有3个线程处理能力的线程池来表达3个坑(holes)的概念.
People - 人, 排队上厕所
Cleaner - 清洁工, 清扫厕所


  1. import java.util.Random;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;

  4. public class ThreadPoolTest {
  5.    
  6.     public static void main(String[] args) {
  7.          ThreadPoolTest().test();//?为什么不可 test();
  8.     }
  9.    
  10.     private void test() {
  11.         Toilet toilet = new Toilet();
  12.         
  13.         boolean allowed = true;
  14.         for (int i=0; allowed; i++) {//!循环的判断条件可以这样用。
  15.             People p = new People(i+"", toilet);//i+""(String类)
  16.             allowed = toilet.allowIn(p);
  17.         }
  18.     }
  19.    
  20.     private class Toilet {
  21.         private volatile boolean cleaning = false;//?volatile的关键字在这里的作用是什么?
  22.         private volatile int volume=0;
  23.         private final int CAPACITY = 100;
  24.         private volatile int peopleIn = 0;
  25.         private volatile int count = 0;
  26.         private Cleaner cleaner;
  27.         // 3 holes in his toilet.
  28.         private ExecutorService holes = Executors.newFixedThreadPool(3);
  29.         
  30.         private Toilet() {
  31.             this.cleaner = new Cleaner(this);//?这里面的两个this所指是什么?
  32.         }
  33.         private synchronized boolean allowIn(Runnable people) {
  34.             // If toilet is cleaning or 3 holes are taken, wait.
  35.             while (this.cleaning == true || this.peopleIn >= 3 ) {
  36.                 try {
  37.                     this.wait();//?会不会造成死锁?
  38.                 } catch (InterruptedException e) {
  39.                     e.printStackTrace();
  40.                 }
  41.             }
  42.             
  43.             // Only serves 100 people one day.
  44.             if (count > 100) {
  45.                 this.holes.shutdown();//!哦,当人数大于100人,线程池关闭了。
  46.                 return false;//!返回假,不准有人进入厕所了。
  47.             } else {
  48.                 this.peopleIn(((People)people).name);
  49.                 holes.submit(people);//线程池接收一个人将分配一个线程给这个人。(即分一个坑给他,然后它执行它的事。)
  50.                 return true;
  51.             }
  52.         }
  53.         
  54.         private synchronized void enEn(String name, int v) {
  55.             this.volume += v;
  56.             System.out.println("People["+name+"] put in ["+v+"]. Toilet volume increases to ["+volume+"]");
  57.             
  58.             // If the volume exceeds capacity, notify cleaner to clean.
  59.             if (this.volume > this.CAPACITY) {
  60.                 this.notifyCleaner();
  61.             }
  62.         }

  63.         private void notifyCleaner() {
  64.             if (this.cleaning == false) {
  65.                 System.out.println("Toilet volume full with ["+volume+"]. Notify cleaner.");
  66.                 holes.submit(cleaner);//?是清洁整个厕所,还是一个坑位?
  67.             }
  68.         }
  69.         
  70.         private synchronized void peopleIn(String name) {
  71.             System.out.println("People["+name+"] comes in.");
  72.             this.peopleIn ++;
  73.             this.count++;
  74.         }
  75.         
  76.         private synchronized void peopleOut(String name) {
  77.             System.out.println("People["+name+"] comes out.");
  78.             this.peopleIn --;//里面的人出来了,通知一下人,即唤醒wait();
  79.             this.notifyAll();
  80.         }
  81.         public synchronized void cleaning() {
  82.             this.cleaning = true;
  83.             
  84.         }
  85.         public synchronized void cleaned() {
  86.             this.cleaning = false;
  87.             this.notifyAll();//!哦,被清洁后,唤醒wait()线程。
  88.         }
  89.     }
  90.    
  91.     // One toilet cleaner.
  92.     private class Cleaner implements Runnable {
  93.         private Toilet toilet;
  94.         private Cleaner(Toilet t) {
  95.             this.toilet = t;
  96.         }

  97.         @Override
  98.         public void run() {
  99.             toilet.cleaning();
  100.             System.out.println("Toilet Cleaning...");
  101.             try {
  102.                 Thread.sleep(2000);
  103.             } catch (InterruptedException e) {
  104.                 e.printStackTrace();
  105.             }
  106.             this.toilet.volume = 0;
  107.             System.out.println("Toilet Clean done.");
  108.             toilet.cleaning = false;
  109.             toilet.cleaned();
  110.         }
  111.     }
  112.    
  113.     private class People implements Runnable {
  114.         private Toilet toilet;
  115.         private String name;
  116.         private People(String name, Toilet t) {
  117.             this.toilet = t;
  118.             this.name = name;
  119.         }

  120.         @Override
  121.         public void run() {
  122.             System.out.println("People["+name+"] is en en en...");
  123.             try {
  124.                 Thread.sleep(new Random().nextInt(500));
  125.             } catch (InterruptedException e) {
  126.                 e.printStackTrace();
  127.             }
  128.             //厕所统计:谁,拉了多少?然后把人放出来。
  129.             toilet.enEn(name, new Random().nextInt(11));
  130.             toilet.peopleOut(name);
  131.         }
  132.         
  133.     }

  134. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马