• Exchanger的介绍

      类Exchanger的功能可以使两个线程之间传输数据。

  • 方法exchange()的使用

     

package com.wjg.unit;

import java.util.concurrent.Exchanger;

public class Run {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<String>();
Run run =new Run();
ThreadA a = run.new ThreadA(exchanger);
ThreadB b = run.new ThreadB(exchanger);
a.start();
b.start();
} public class ThreadA extends Thread{ private Exchanger<String> exchanger; public ThreadA(Exchanger<String> exchanger) {
super();
this.exchanger = exchanger;
} @Override
public void run() {
try {
String receive = exchanger.exchange("123");
System.out.println("在线程A中获得线程B的值:"+receive);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public class ThreadB extends Thread{ private Exchanger<String> exchanger; public ThreadB(Exchanger<String> exchanger) {
super();
this.exchanger = exchanger;
} @Override
public void run() {
try {
String receive = exchanger.exchange("456");
System.out.println("在线程B中获得线程A的值:"+receive);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} 运行结果:
在线程A中获得线程B的值:456
在线程B中获得线程A的值:123

方法exchange(V x,long timeout,TimeUnit unit)的使用

此方法是指在指定的时间内没有其他线程获取数据,则出现超时异常。

package com.wjg.unit1;

import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; public class Run2 {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<String>();
Run2 run =new Run2();
ThreadA a = run.new ThreadA(exchanger);
a.start();
} public class ThreadA extends Thread{
  
private Exchanger<String> exchanger; public ThreadA(Exchanger<String> exchanger) {
super();
this.exchanger = exchanger;
} @Override
public void run() {
try {
//设置超时时间
String receive = exchanger.exchange("123",5,TimeUnit.SECONDS);
System.out.println("在线程A中获得线程B的值:"+receive);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
} 执行结果:
java.util.concurrent.TimeoutException
    at java.util.concurrent.Exchanger.exchange(Exchanger.java:683)
    at com.wjg.unit1.Run2$ThreadA.run(Run2.java:27)

多线程编程(二)-Exchanger的使用的更多相关文章

  1. Linux系统编程@多线程编程(二)

    线程的操作 线程标识 线程的ID表示数据类型:pthread_t (内核中的实现是unsigned long/unsigned int/指向pthread结构的指针(不可移植)几种类型) 1.对两个线 ...

  2. java多线程编程(二)

    1. wait 和 sleep 区别? 1.wait可以指定时间也可以不指定,sleep必须指定时间. 2.在同步中时,对cpu的执行权和锁的处理不同.  wait:释放执行权,释放锁.  sleep ...

  3. java多线程编程(二创建线程)

    1.概念           因为java是完全面向对象的,所以在java中,我们说的线程,就是Thread类的一个实例对象.所以,一个线程就是一个对象,它有自己字段和方法. 2.创建线程 创建线程有 ...

  4. Android多线程编程<二>Handler异步消息处理机制之Message

      Message(消息):       一. Message的字段:    在Android中,Message作为线程之间(主要是子线程和UI主线程之间)数据交换的载体,通过Handler去传递.它 ...

  5. C++多线程编程二

    1. 死锁与解锁: #include <iostream> #include <thread> #include <mutex> using namespace s ...

  6. C语言多线程编程二

    一. 线程通信----事件: 1.一对一模式: #include <stdio.h> #include <stdlib.h> #include <Windows.h> ...

  7. java多线程编程——同步器Exchanger

    类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据.每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程 ...

  8. Windows下多线程编程(二)

    线程的分类 1.     有消息循环线程 MFC中有用户界面线程,从CWinThread派生出一个新的类作为UI线程类CUIThread,然后调用AfxBeginthread(RUNTIME_CLAS ...

  9. UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性

    lienhua342014-11-09 1 线程属性概括 POSIX 线程的主要属性包括 scope 属性.detach 属性.堆栈地址.堆栈大小.优先级.在头文件 pthread.h 中定义了结构体 ...

随机推荐

  1. [Erlang24]使用zotonic搭建网站记录

    zotonic的搭建网站(blog)记录:   zotonic:用Erlang做的一个web 框架:   和wordpress 类似,但是官网称比PHP CMS要快10倍以上   先看看我的成果:正弦 ...

  2. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

  3. Centos7 创建Eclipse启动

    Eclipse是一个集成开发环境(IDE),包含一个基工作区和定制环境的可扩展插件系统.大部分使用 Java 编写,Eclipse 可以用来开发应用程序.通过各种插件,Eclipse 也可以用于其他编 ...

  4. Mysql修改字段类型

    mysql 修改字段长度 alter table news  modify column title varchar(130); alter table 表名 modify column 字段名 类型 ...

  5. django系列6--Ajax05 请求头ContentType, 使用Ajax上传文件

    一.请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有三种: 1.application/x-www-form-urlencoded 这应该是最常见的 POST ...

  6. c++实验6 递归

    1 利用递归设计此函数. int p(int a,int b) { if(a>=b) ; else ; } //粘贴测试数据及运行结果: //测试数据 int main() { cout < ...

  7. JavaScript多个h5播放器video,点击一个播放其他暂停

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. elasticsearch.net search入门使用指南中文版(翻译)

    elasticsearch.net search入门使用指南中文版,elasticsearch.Net是一个非常底层且灵活的客户端,它不在意你如何的构建自己的请求和响应.它非常抽象,因此所有的elas ...

  9. luncene 查询字符串的解析-QueryParser类

    搜索流程中的第二步就是构建一个Query.下面就来介绍Query及其构建. 当用户输入一个关键字,搜索引擎接收到后,并不是立刻就将它放入后台开始进行关键字的检索,而应当首先对这个关键字进行一定的分析和 ...

  10. 图解JVM内存分配和回收

    一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...