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

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多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    java线程同步及通信

    虽然示例中未直接涉及,但在实际应用中,线程同步可能导致死锁(两个或多个线程相互等待对方释放资源导致的僵局)或活锁(线程不断重试导致的无法前进状态)。避免这些情况通常需要谨慎设计同步策略,如使用超时、...

    java tcp多线程通信

    Java TCP多线程通信是网络编程中的一个重要概念,它结合了Java的Socket编程与多线程技术,使得多个客户端能够同时与服务器进行交互。在Java中,TCP(传输控制协议)提供了一种可靠的数据传输方式,确保数据的有序、...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java提供了synchronized关键字来实现方法或代码块的同步,防止多个线程同时访问同一块代码。 9.7 在同步方法中使用wait(), notify和notifyAll(): 这些方法用于线程间通信。wait()使当前线程进入等待状态,直到收到...

    Java多线程技术在网络通信系统中的应用.pdf

    使用Java多线程技术,可以在服务器端创建一个主线程,负责接收来自客户端的连接请求,并为每一个请求创建一个新的线程来处理客户端与服务器之间的通信。这样,服务器就可以同时处理多个客户端的请求,提高系统效率。...

    JAVA单线程多线程

    2. **易于调试**:单线程程序的调试相对容易,因为不存在多个线程之间复杂的交互情况。 3. **资源消耗少**:单线程程序创建和切换线程的开销较小,对于资源有限的环境更为友好。 然而,单线程也有其局限性: 1. **...

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java多线程经典案例

    线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或...

    java多线程Demo

    在多线程环境下,如果一个变量被多个线程共享且只进行读写操作,可以使用volatile保证数据的一致性。 9. sleep(), yield(), interrupt(): - sleep()方法使当前线程暂停指定的时间,然后继续执行。 - yield()方法...

    java多线程的讲解和实战

    1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java通过`Thread`类和`Runnable`接口来创建和管理线程。每个线程都有自己的生命周期,包括新建、就绪、运行、阻塞和结束五个...

    java实现多线程间的通信

    本文将探讨线程间通信的概念,分析基于Java的多线程程序的关键技术,并指出设计多线程程序时需要充分理解线程同步机制以及操作系统进程之间的关系,以便优化程序性能。 关键词:多线程、同步 在当前大多数操作系统...

    Java多线程通信机制研究.pdf

    Java多线程通信机制是Java程序设计中的一个复杂技术,涉及到多个线程之间的通信和协作。多线程是一种程序运行机制,它允许在程序中并发执行多个指令流,每个指令流都被称为一个线程,彼此间互相独立。 多线程之间的...

    java 多线程同步

    Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...

    彻底明白Java的多线程-线程间的通信.doc

    为了实现真正的并发,我们需要使用更复杂的同步机制,如线程同步或线程间通信。 接着,我们来看如何在Java中实现多线程。有两种主要方式:继承`Thread`类和实现`Runnable`接口。 1. **继承Thread类**: 当一个类...

    java+多线程+同步详解源代码学习

    在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程环境下数据的一致性和完整性。下面将对这两个关键知识点进行深入解析。 一、Java多线程 1. **线程创建...

    JAVAJAVA多线程教学演示系统论文

    3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...

    java线程线程安全同步线程

    同步线程则是指通过特定机制(如锁)来控制多个线程访问共享资源的顺序,避免出现竞态条件和死锁。 在Java中,线程的创建可以通过继承`Thread`类或实现`Runnable`接口。线程的主体行为定义在`run()`方法中,当`...

    java10个线程按照顺序打印1-100

    然而,当多个线程需要共享资源或按照特定顺序执行时,就需要进行线程同步。 1. **synchronized**:在Java中,`synchronized`关键字用于提供互斥访问,确保同一时间只有一个线程可以访问特定的代码块。例如,可以...

Global site tag (gtag.js) - Google Analytics