zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第16章:线程与锁——题目5

    2014-04-27 20:16

    题目:假设一个类Foo有三个公有的成员方法first()、second()、third()。请用锁的方法来控制调用行为,使得他们的执行循序总是遵从first、second、third的顺序。

    解法:你应该想到了用lock的方法类阻塞,不过这里面有个概念问题使得直接用ReentrantLock不能通过编译(对于一个锁对象,不同在A线程中锁定,又在B线程中解锁,不允许这样的归属关系),可以用Semaphore来达到相同的目的。请看下面的代码。

    代码:

      1 // 16.5 There're three methods in a class FooBar, how would you make sure that they're executed in a fixed order, in whichever order they're called?
      2 public class FirstRun implements Runnable {
      3     private FooBar fooBar;
      4     
      5     public FirstRun(FooBar fooBar) {
      6         // TODO Auto-generated constructor stub
      7         this.fooBar = fooBar;
      8     }
      9     
     10     @Override
     11     public void run() {
     12         // TODO Auto-generated method stub
     13         fooBar.first();
     14     }
     15 }
     16 
     17 // -----------------------------------------------------------------------------
     18 public class SecondRun implements Runnable {
     19     private FooBar fooBar;
     20     
     21     public SecondRun(FooBar fooBar) {
     22         // TODO Auto-generated constructor stub
     23         this.fooBar = fooBar;
     24     }
     25     
     26     @Override
     27     public void run() {
     28         // TODO Auto-generated method stub
     29         fooBar.second();
     30     }
     31 }
     32 
     33 // -----------------------------------------------------------------------------
     34 public class ThirdRun implements Runnable {
     35     private FooBar fooBar;
     36     
     37     public ThirdRun(FooBar fooBar) {
     38         // TODO Auto-generated constructor stub
     39         this.fooBar = fooBar;
     40     }
     41     
     42     @Override
     43     public void run() {
     44         // TODO Auto-generated method stub
     45         fooBar.third();
     46     }
     47 }
     48 
     49 // -----------------------------------------------------------------------------
     50 import java.util.concurrent.Semaphore;
     51 
     52 public class FooBar {
     53     private Semaphore sem1;
     54     private Semaphore sem2;
     55     private Semaphore sem3;
     56     
     57     public FooBar() {
     58         // TODO Auto-generated constructor stub
     59         sem1 = new Semaphore(1);
     60         sem2 = new Semaphore(1);
     61         sem3 = new Semaphore(1);
     62         
     63         try {
     64             sem1.acquire();
     65             sem2.acquire();
     66             sem3.acquire();
     67         } catch (InterruptedException e) {
     68             // TODO Auto-generated catch block
     69             e.printStackTrace();
     70         }
     71     }
     72 
     73     public void first() {
     74         System.out.println("first");
     75         
     76         sem1.release();
     77     }
     78 
     79     public void second() {
     80         try {
     81             sem1.acquire();
     82         } catch (InterruptedException e) {
     83             // TODO Auto-generated catch block
     84             e.printStackTrace();
     85         }
     86         sem1.release();
     87         System.out.println("second");
     88         sem2.release();
     89     }
     90 
     91     public void third() {
     92         try {
     93             sem2.acquire();
     94         } catch (InterruptedException e) {
     95             // TODO Auto-generated catch block
     96             e.printStackTrace();
     97         }
     98         sem2.release();
     99         System.out.println("third");
    100         sem3.release();
    101     }
    102 
    103     public static void main(String[] args) {
    104         FooBar fooBar = new FooBar();
    105         Thread t1 = new Thread(new FirstRun(fooBar));
    106         Thread t2 = new Thread(new SecondRun(fooBar));
    107         Thread t3 = new Thread(new ThirdRun(fooBar));
    108         
    109         t3.start();
    110         t1.start();
    111         t2.start();
    112     }
    113 }
  • 相关阅读:
    信息安全系统设计基础第一次实验报告
    学号20145220《信息安全系统设计基础》第8周学习总结
    学号20145220《信息安全系统设计基础》第8周学习总结
    学号20145220《信息安全系统设计基础》第7周学习总结
    学号20145220《信息安全系统设计基础》第7周学习总结
    学号20145220 《信息安全系统设计基础》第6周学习总结
    # 学号20145220 《信息安全系统设计基础》第6周学习总结
    # 学号 20145220《信息安全系统设计基础》第5周学习总结
    java读取文件中每一行字符串的出现次数
    【转载】Idea常见问题整理
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3695138.html
Copyright © 2011-2022 走看看