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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package cn.darkhorse.exerrice;

  2. /**
  3. * 题目:子程序运行10次,运行主程序100次,子程序在运行10次,主程序在运行100次,来回往复50次
  4. * */
  5. public class TraditionalSynchronizedTest {
  6.        
  7.         public static void main(String[] args) {
  8.                 //实例化锁的对象
  9.                 final Business b = new Business();
  10.                 //子线程
  11.                 new Thread(){
  12.                         @Override
  13.                         public void run(){
  14.                                 for(int i = 1;i <= 50 ; i++){
  15.                                         b.sub(i);
  16.                                 }
  17.                         }
  18.                 }.start();
  19.                 //主线程
  20.                 for(int i = 1;i <= 50 ; i++){
  21.                         b.main(i);
  22.                 }
  23.         }
  24. }
  25. /**
  26. * 总结经验
  27. * 1.实际的编程中,我们经常把一类操作共同资源的方法,放在同一个类中.
  28. * 2.在多线程编程中,我们把锁的代码(操作共同资源的代码),提取出来成一个方法,并不放在多线程执行的代码中。
  29. *   这样做使思路更加的清晰,更利于我们分析问题
  30. *
  31. *
  32. * */
  33. class Business{
  34.        
  35.         private boolean  sControl = true;
  36.         /**
  37.          * 一般编程时,用synchronized来控制同步锁
  38.          * 也就是在这里进行互斥操作
  39.          * 对同一个锁的对象持有和释放
  40.          * */
  41.         public synchronized void sub(int j){
  42.                 while(sControl){//判断两次 比if多一次, 进入和出来的时候 提高安全性
  43.                         try {
  44.                                 this.wait();
  45.                         } catch (InterruptedException e) {
  46.                                 e.printStackTrace();
  47.                         }
  48.                 }
  49.                 for(int i = 1;i<=10;i++){
  50.                         System.out.println("sub execute of " + i + " count of " + j);
  51.                 }
  52.                 sControl = true;
  53.                 this.notify();
  54.         }
  55.        
  56.         public synchronized void main(int j){
  57.                 while(!sControl){
  58.                         try {
  59.                                 this.wait();
  60.                         } catch (InterruptedException e) {
  61.                                 e.printStackTrace();
  62.                         }
  63.                 }
  64.                 for(int i = 1; i <= 100;i++){
  65.                         System.out.println("main execute of " + i + " count of " + j);
  66.                 }
  67.                 sControl = false;
  68.                 this.notify();
  69.         }
  70. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

0 个回复

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