`
endual
  • 浏览: 3578918 次
  • 性别: 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中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。

    编写程序,使用两个线程,一个队列,其中一个线程从键盘读取数据,放入到队列中,直到读取的数据是字符串quit则结束

    1. 编写程序,使用两个线程,一个队列, 其中一个线程从键盘读取数据,放入到队列中,直到读取的数据是字符串quit则结束,线程的任务就是循环读取数据直到特定的字符串quit。另外一个线程,不断的从队列中读取数据...

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

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

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

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

    java程序 两个线程实现学生成绩的读写

    在这个场景下,我们可能创建了两个类,一个是`WriterThread`用于写入成绩,另一个是`ReaderThread`用于读取并显示成绩。 在写入线程(`WriterThread`)中,我们需要一个共享的数据结构来存储成绩,例如一个`HashMap, ...

    C# 两个窗体之间实时传递数据的实例

    在这个实例中,我们将探讨如何在两个窗体之间实现实时的数据传递,主要采用委托和事件的技术。这种方式可以确保数据的安全性,避免了直接引用导致的问题。 首先,我们需要理解委托和事件的基本概念。在C#中,委托是...

    delphi 多线程 读取数据

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

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

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

    易语言线程返回数据的方法

    3. **共享数据结构**:线程可以将结果存入一个共享数据结构(如数组或链表),然后通过同步机制(如锁)通知其他线程数据已准备好。 4. **使用线程句柄**:易语言允许通过线程句柄发送消息,线程执行完毕后,可以...

    两个串口多线程通信

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

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

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

    java用线程两种方式

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

    Android两个子线程之间的通信

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

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

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

    两个线程交替执行

    在上述代码中,我们可以看到两个线程 a 和 b,它们之间通过一个锁对象 LOCK 进行同步。线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一...

    易语言类中启动线程

    - 线程同步:如果需要在主线程和线程之间进行数据交换,可以使用同步机制,如“挂起当前线程”、“唤醒线程”等命令。 5. 线程管理: - 线程退出:线程函数执行完毕或者遇到“结束线程”命令后,线程会自动退出。...

    易语言创建类线程

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

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

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

Global site tag (gtag.js) - Google Analytics