4.传统线程同步通信技术

 1 /**
 2  * 传统线程同步通信技术
 3  *
 4  * *******************************************
 5  * 经验:
 6  *       要用到共同数据(包括共同锁)或共同算法的若干个方法应该
 7  * 归在用一个类身上,这种设计正好体现了高内聚和程序的健壮性。
 8  *
 9  * *******************************************
10  *
11  * @author LiTaiQing
12  */
13 public class TraditionalThreadCommunication {
14
15     /**************************************************
16      * 调试小技巧
17      * 如果由于Console的输出太多而造成面板显示的数据不完整
18      * 可设置运行前参数设置
19      * 右键->Run As->Run Configuractions->Common->File
20      * 选择保存的路径即可
21      *
22      **************************************************
23      */
24
25
26     /**
27      * 面试题
28      * ·子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,
29      * ·接着再回到主线程又循环100,如此循环50次,请写出程序
30      */
31     public static void main(String[] args){
32
33         final Business business = new Business();
34         new Thread(new Runnable(){
35             @Override
36             public void run() {
37                 for(int i = 1; i <= 50; i++){
38                     business.sub(i);
39                 }
40             }
41         }).start();
42         for(int i = 1; i <= 50; i++){
43             business.main(i);
44         }
45     }
46
47 }
48
49 class Business{
50     private boolean bShouldSub = true;
51     public synchronized void sub(int i){
52         /**
53          * 此处将if改为while,增强代码健壮性。
54          * 防止伪唤醒!
55          */
56         while(!bShouldSub){
57             try {
58                 this.wait();
59             } catch (InterruptedException e) {
60                 e.printStackTrace();
61             }
62         }
63         for(int j = 1; j <= 10; j++){
64             System.out.println("sub thread sequece of " + j + ",loop of " +i);
65         }
66         bShouldSub = false;
67         this.notify();
68     }
69     public synchronized void main(int i){
70         while(bShouldSub){
71             try {
72                 this.wait();
73             } catch (InterruptedException e) {
74                 e.printStackTrace();
75             }
76         }
77         for(int j = 1; j <= 100; j++){
78             System.out.println("main thread sequece of " + j + ",loop of " +i);
79         }
80         bShouldSub = true;
81         this.notify();
82     }
83 }
时间: 2024-11-08 20:25:37

4.传统线程同步通信技术的相关文章

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声

JAVA 并发编程-传统线程同步通信技术(四)

首先介绍几个概念: wait()方法 wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法. 当前的线程必须拥有当前对象的monitor,也即lock,就是锁. 线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行. 要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或s

【java并发】传统线程同步通信技术

先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务是执行5次,子线程的任务是执行10次.线程间通信技术主要用到wait()方法和notify()方法.wait()方法会导致当前线程等待,并释放所持有的锁,notify()方法表示唤醒在此对象监视器

传统线程同步通信技术

先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务是执行5次,子线程的任务是执行10次.线程间通信技术主要用到 wait() 方法和 notify() 方法.wait() 方法会导致当前线程等待,并释放所持有的锁,notify() 方法表示唤醒在

【Java多线程与并发库】4.传统线程同步通信技术

我们先通过一道面试题来了解传统的线程同步通信. 题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序. 我没有看答案,先用自己的思路写了一段代码,有一些是借鉴传统的“生产者与消费者”的多线程模型写出来的:[java] view plain copy 在CODE上查看代码片派生到我的代码片package cn.edu.hpu.test; /** * 要求的操作: * 子线程循环10次,接着主线程循环100次,接着又回

Java多线程与并发库高级应用-传统线程同步通信技术

面试题: 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 /** * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着又 主线程循环100次,如此循环50次,请写出程序 * * @author Administrator * */ public class TraditionalThreadCommunication { public static void main(String[] arg

(黑马Java多线程与并发库高级应用)04 传统线程同步通信技术

子线程10次,然后主线程100次,然后子线程10次,然后主线程100次.循环50次 package cn.itcast.heima2; public class TraditionalThreadComunication { public static void main(String[] args) { // TODO Auto-generated method stub Business business = new TraditionalThreadComunication().new B

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest

线程同步通信技术(三)

一. 线程通信: 在同步方法中,线程之间的通信主要依靠以下三个方法来实现: 1. wait() 调用该方法会使当前线程暂停执行并释放对象锁,让其他线程可以进入Synchronized代码块,当前线程放入对象等待池中. 2. notify() 调用该方法会从对象等待池中移走任意一个线程 3. notifyAll() 调用该方法会从对象等待池中移走所有等待的线程. 二. 一道面试题: 子线程循环10次,接着主线程循环100次, 接着又回到子线程循环10次,接着再回到主线程循环100次,如此循环50次