`
Luob.
  • 浏览: 1572070 次
  • 来自: 上海
社区版块
存档分类
最新评论

java 多个线程之间同步通信

    博客分类:
  • Java
阅读更多

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *  Lock 类似  synchronize  (让多个线程 执行任务的时候 相互不干扰,不被打断  :互斥)  
 *	Condition  (让多个线程之间 进行 交流   :通信)
 *
 *  例子 : 老大 --> 老二  -->老三     --> 老大 --> 老二  -->老三    
 */
public class ThreeConditionCommunication2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Business bus=new ThreeConditionCommunication2().new Business();
		
		new Thread(
				new Runnable(){

					@Override
					public void run() {
						for (int j = 0; j < 5; j++) {
							bus.sub2(j);
						}
					}
				}
		).start();
			
		new Thread(
				new Runnable(){

					@Override
					public void run() {
						for (int j = 0; j < 5; j++) {
							bus.sub3(j);
						}
					}
				}
		).start();
		
		for (int j = 0; j < 5; j++) {
			bus.sub1(j);
		}
			
		
	}

	//主要是这里不同 
	class Business{
		Lock lock=new ReentrantLock();
		Condition con1=lock.newCondition();  // 1 - 2 通信
		Condition con2=lock.newCondition();  // 2 - 3 通信 
		
		int step=1;
		public void sub1(int i){
			lock.lock();
			try {
				while(step!=1)
					con1.await();
				
				for (int j = 0; j < 100; j++) {
					System.out.println("main thread sequence of "+j+" loop of"+i);
				}
				step=2;
				con1.signal();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
		
		public void sub2(int i){
			lock.lock();
			try {
				while(step!=2)
					con1.await();
				
				for (int j = 0; j < 10; j++) {
					System.out.println("Sub2 thread sequence of "+j+" loop of"+i);
				}
				step=3;
				con2.signal();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
		
		public void sub3(int i){
			lock.lock();
			try {
				while(step!=3)
					con2.await();
				
				for (int j = 0; j < 20; j++) {
					System.out.println("Sub3 thread sequence of "+j+" loop of"+i);
				}
				step=1;
				con1.signal();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
	}
}




/**
 *  Lock 类似  synchronize  (让多个线程 执行任务的时候 相互不干扰,不被打断  :互斥)  
 *	Condition  (让多个线程之间 进行 交流   :通信)
 *
 * 例子 :三个线程之间的互斥  和 通信
 */
public class ThreeConditionCommunication {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Business bus=new ThreeConditionCommunication().new Business();
		
		new Thread(
				new Runnable(){

					@Override
					public void run() {
						for (int j = 0; j < 5; j++) {
							bus.sub2(j);
						}
					}
				}
		).start();
			
		new Thread(
				new Runnable(){

					@Override
					public void run() {
						for (int j = 0; j < 5; j++) {
							bus.sub3(j);
						}
					}
				}
		).start();
		
		
		for (int j = 0; j < 5; j++) {
			bus.sub1(j);
		}
			
		
	}

	// 三个 Condition
	class Business{
		Lock lock=new ReentrantLock();
		Condition con1=lock.newCondition();
		Condition con2=lock.newCondition();
		Condition con3=lock.newCondition();
		int step=1;
		
		public void sub1(int i){
			lock.lock();
			try {
				while(step!=1)
					con1.await();
				
				for (int j = 0; j < 20; j++) {
					System.out.println("main thread sequence of "+j+" loop of"+i);
				}
				step=2;
				con2.signal();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
		
		public void sub2(int i){
			lock.lock();
			try {
				while(step!=2)
					con2.await();
				
				for (int j = 0; j < 10; j++) {
					System.out.println("Sub2 thread sequence of "+j+" loop of"+i);
				}
				step=3;
				con3.signal();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
		
		public void sub3(int i){
			lock.lock();
			try {
				while(step!=3)
					con3.await();
				
				for (int j = 0; j < 20; j++) {
					System.out.println("Sub3 thread sequence of "+j+" loop of"+i);
				}
				step=1;
				con1.signal();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
		
	}
}
分享到:
评论

相关推荐

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    深入解析Java的线程同步以及线程间通信

    主要介绍了Java的线程同步以及线程间通信,多线程编程是Java学习中的重点和难点,需要的朋友可以参考下

    java多线程安全性基础介绍.pptx

    多个线程操作共享对象导致的状态不一致问题 原因 共享资源的竞态条件问题 问题 竞态条件 指令重排序 工作内存中主内存同步延迟 解决 要有安全策略文档或注释 不共享 线程封闭 仅在单线程内访问数据 栈...

    92道Java多线程与并发面试题含答案(很全)

    同步(Synchronization):同步是控制多个线程访问共享资源的方式,以防止数据不一致和竞态条件。Java提供了多种同步机制,包括synchronized关键字、Lock接口和Semaphore类。 线程间通信(Inter-Thread ...

    Java并发理论,如何理解线程安全.docx

    当多个线程访问同一个对象时,如果不用考虑这些线程在运行环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那么这个对象时线程的 ...

    Java 多线程编程面试集锦20道问题解答Java多线程编程高难度面试题及解析

    本篇文章提供了20道高难度的Java多线程编程面试题及详细解析,旨在帮助开发者展示出卓越的并发编程能力。在当今高并发的应用场景下,对多线程编程的理解和应用是评估面试者的重要指标。通过这些高难度问题,您将全面...

    Java程序设计案例教程-第8章-多线程编程.pptx

    进程在执行过程中拥有独立的内存单元,而多个线程共享内存,线程之间的通信比较容易解决,从而极大地提高了程序的运行效率。 在基于线程的多任务环境中,最小的可调度代码单元是线程,这意味着单个程序可以同时执行...

    JAVA 多线程

     一个进程中的线程共享相同的内存单元/内存地址空间à可以访问相同的变量和对象,而且它们从同一堆中分配对象à通信、数据交换、同步操作  由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制...

    java并发之内存模型.docx

    在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和...

    Java多线程共享数据、同步、通信

     a)继承Thread,那么我们可以创建很多个这样的类,但是每个这样的类都是相互不关联的,也是说我们Thread类中的内容每个创建出来的类都有一份,因此它不适合作为数据共享的线程来操作。同时由于Java继承的性,我们...

    Java多线程与线程安全实践-基于Http协议的断点续传(源码)

    本题目的研究内容包括以下几个方面:首先,研究Java多线程技术,包括线程的创建、同步、通信等机制,以及线程安全的概念和实现方法。然后,研究Http协议,包括Http请求和响应的格式、状态码等,以及如何利用Http协议...

    多线程机制

    7、 浅析 Java Thread.join() : java多线程实现主线程等待所有子线程执行完毕 16 8、 线程运行中抛出异常的处理 19 9、 Callable 有返回值的线程 20 10、 Callable结合FutureTask的多线程使用(免打扰模式) 24

    多线程多线程.zip

    该文档是笔者在学习李刚老师《Java疯狂讲义》中有关多线程的用法而总结出来的笔记,其中主要的内容包括线程创建和启动、线程的生命周期、控制线程、线程同步、线程通信线程池等基本内容。对Java多线程有详细的介绍。...

    讲给女朋友听的java多线程(2万字深入理解多线程,有实例代码辅助理解)

    使用线程池线程的调度线程的生命周期线程同步1. 方法一:同步代码块2. 方法二:同步方法3. 方法三:Lock(锁):4. 对比三种方法5. 典型例题6. 线程死锁问题线程通信两个方法sleep()方法和wait()典型例题 读完本文...

    基于Java多线程的并发机制的研究和实现

    研究了程序并发过程中的同步机制和交互通信机制,比较了基于操作系统级和基于Java多线程级并发机制的实现结构,总结了并发程序中死锁预防的一些编程规则和策略。所构造的一个具有完全意义上的并发同步的框架实例有...

    java—多线程的通信、生产者与消费者模式

    一、重点知识 isDaemon 判断是否为守护线程。 run方法是不能用synchronized修饰,他是继承来的,不能改变其结构,...stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程进去调用他的一个方法

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。 主要原因是,对于多线程实现实现并发,一直以来,多线程都存在2个问题: ● 线程...

    多线程知识梳理.xmind

    从多线程的基础、线程同步、线程间通信、线程调度、线程池、并发容器、线程安全的集合、原子变量等方面去罗列主要知识点,以思维导图的方式进行呈现,可以让读者更条理清晰的在最短的时间内掌握多线程的主要知识

    JAVA_API1.6文档(中文)

    javax.swing.plaf.multi 提供了组合两个或多个外观的用户界面对象。 javax.swing.plaf.synth Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。 javax.swing.table 提供用于处理 javax.swing....

Global site tag (gtag.js) - Google Analytics