`
endual
  • 浏览: 3558356 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Exchager 类两个线程之间交换数据

    博客分类:
  • java
 
阅读更多

我们多线程之间有时候执行的时候要交换线程之间的数据,这样我们可以用的是exchager这个类的。

 

默认的数据返回应该是boolean类型的,在定义这个对象的时候要进行泛型的指定。下面请看举例。

 

例子是学生和老师进行名片的交换。

场景设置:

新学期开始了,学生和老师碰面了,学生拿出名片的时间10秒,老师拿出名片的时间是20秒,然后交换名片,各自打印出来。

//学生线程类

package endual;

import java.util.concurrent.Exchanger;

public class Student implements Runnable{

	private Exchanger<String> ex ;
	public Student(Exchanger<String> ex) {
		this.ex = ex ;
	}
	
	public void run() {
        String msg = "Student" ;
        System.out.println("我是学生,我现在的信息是:" + msg) ;
        
        try {
			Thread.sleep(10000) ;
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        
         try {
           msg =  ex.exchange(msg) ;
           System.out.println("我是学生我现在的信息是 :" + msg) ;
            
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

 

 

老师的线程类

package endual;

import java.util.concurrent.Exchanger;

public class Teacher implements Runnable {
	private Exchanger<String> ex ;
	public Teacher(Exchanger<String> ex) {
		this.ex = ex ;
	}
	
	public void run() {
      String msg = "teacher" ;
      System.out.println("我是老师,我现在的信息是" + msg) ;
      try {
			Thread.sleep(20000) ;
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		   try {
			   msg =  ex.exchange(msg) ;
	           System.out.println("我是老师,我现在的信息是 :" + msg) ;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
}

 

 

 

测试的类 用到了线程池的

package endual;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * Exchanger 表示的两个线程之间进行数据交换用的
 * @author endual
 *
 */
public class ExchangerApp {

	
	public static void main(String[] args) {
		
		ExecutorService es = Executors.newCachedThreadPool() ;
		Exchanger<String> ex = new Exchanger<String>() ;
		
	    Thread t1 = new Thread(new Student(ex)) ;
	    Thread t2 = new Thread(new Teacher(ex)) ;
	    
		
	    es.execute(t1) ;
	    es.execute(t2) ;
		
		
	}
}

 

打印的结构是

我是学生,我现在的信息是:Student
我是老师,我现在的信息是teacher
我是老师,我现在的信息是 :Student
我是学生我现在的信息是 :teacher

 

 

其实从时间的运行时间来看是一样的,谁先完成工作,谁就会在等待的,并不是谁先完成工作了,马上就主动的进行数据的交换而是要等待大家都完成了工作了,才进行彼此的数据交换的

 

 

分享到:
评论

相关推荐

    MFC 多线程之间通过消息传递数据

    本主题将深入探讨如何在MFC的多线程环境中通过消息传递来交换数据。 首先,我们要了解MFC对多线程的支持。MFC提供了一个CWinThread类,它是所有线程的基础。创建新线程时,通常会从CWinThread派生一个新的类,并...

    实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次。

    本实验的任务是设计并实现一个数据单元,该单元包含学号和姓名两个字段,并且使用两个线程,一个用于写入数据,另一个用于读取数据。这种设计模式被称为“生产者-消费者”问题,是多线程编程中的经典案例。 首先,...

    利用Handler在线程之间传递数据

    这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。

    qt线程共享数据 信号和槽方式

    即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的。 Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容。Qt线程间共享数据主要有两种方式...

    可在两个程序之间传递数据

    两个程序可以通过定义和调用公共的API(Application Programming Interface)来交换数据。这些API可以是函数库、Web服务接口(RESTful API、SOAP)或者是操作系统提供的服务。 4. **文件共享**: 数据可以通过...

    delphi 多线程 读取数据

    为了实现这一目标,我们将文件内容分割成前后两部分,并创建两个线程,每个线程负责读取并处理一部分数据。这样做可以避免一次性加载整个文件到内存中,减少对系统资源的需求,同时利用多核处理器的优势,提高数据...

    C# 多线程互斥 两个线程交替工作

    这两个类提供了线程同步机制,允许一个线程等待另一个线程完成其操作。例如,`AutoResetEvent`在被触发后会自动重置,只允许一个线程通过,而`ManualResetEvent`需要手动重置。 ```csharp using System.Threading; ...

    两个串口多线程通信

    串口通信,也称为RS-232通信,是计算机与设备之间进行数据交换的一种常见方式。它允许通过串行接口连接硬件设备,如传感器、打印机、GPS接收器等。在多线程环境中,我们可以通过创建独立的线程来同时管理两个串口,...

    多线程进程间交换数据使用的共享内存

    多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存多线程进程间交换数据使用的共享内存

    Android两个子线程之间的通信

    本文将深入探讨如何在Android环境中实现两个子线程之间的通信。 首先,理解Android线程模型至关重要。主线程,也称为UI线程,负责处理用户界面的更新和事件响应。为了不阻塞主线程,我们通常会在子线程中执行耗时...

    java用线程两种方式

    在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...

    Qt线程之间通信、线程和进程之间通信实例

    这个例子中,`ThreadA`发送数据,`ThreadB`接收数据,展示了线程间的信号和槽通信。 请注意,实际项目中应根据需求选择合适的通信方式,考虑性能、安全性以及平台兼容性等因素。在编写多线程或多进程代码时,正确...

    易语言创建类线程

    在多线程环境中,线程之间可能需要交换信息,例如通过消息队列、共享内存等方式。附加文本可能是这些通信过程中的重要数据,或者是用来记录线程执行情况的日志信息。 "取_类_函数地址"是获取类中函数的内存地址,这...

    用多线程实现串口读写数据以及文件的读写

    可以通过使用CSingleLock或CCriticalSection等同步对象来确保在任何时候只有一个线程能访问文件,防止数据冲突。 此外,调试时,可以借助串口调试助手工具,如RealTerm或PuTTY,实时查看串口通信的数据流,这有助于...

    跨线程提交数据

    跨线程提交数据涉及到两个或多个线程之间共享和修改同一份数据。这通常需要特殊的同步机制,以防止竞态条件和死锁。竞态条件是指当两个或更多线程同时访问和修改同一资源时,结果依赖于线程的执行顺序,可能导致不...

    qt多线程实例-数据处理和UI界面显示

    这个实例“qt多线程实例-数据处理和UI界面显示”很可能是为了展示如何在不阻塞UI的情况下进行繁重的数据处理任务。 在单线程应用中,如果数据处理任务耗时较长,程序会冻结,用户界面无法响应,这将导致用户体验...

    Java多线程调用BlockingDeque跑批量数据的例子

    一个线程从A表读数据放入队列 N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送...

    VC中利用多线程技术实现线程之间的通信

    1. **共享内存**:线程可以访问同一块内存空间,从而实现数据交换。为了防止数据竞争,需要使用互斥量(`mutex`)或临界区(`critical section`)等同步机制来保护共享资源。 2. **事件对象**:VC++中的事件对象(`...

    C# 高效线程安全,解决多线程写txt日志类.zip

    "C# 高效线程安全,解决多线程写txt日志类.zip" 提供了一个专门用于多线程环境下写入txt日志文件的解决方案,确保了在并发写入时的数据一致性与程序稳定性。 首先,我们要理解什么是线程安全。线程安全是指当多个...

    呵呵仙_类_启动线程自定义数据5

    1,增加同时支持填整数型或子程序指针的函数指针!。 2,更正交换空数据时,可能存在的不跳出循环体. 3,增加延时参数,用于线程调用线程时,能起到降底CPU强度,方便提速取值!!。 @呵呵仙。

Global site tag (gtag.js) - Google Analytics