1 两个线程进行数据交换
package thread.test1; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.Exchanger; /** * 作用:Exchanger :两个线程进行数据交换 * */ public class ExchangerTest { public static void main(String[] args) { ExchangerTest exchangerTest = new ExchangerTest(); Exchanger<List<Integer>> exchanger = new Exchanger<List<Integer>>(); new Thread(exchangerTest.new Work(1, exchanger)).start(); new Thread(exchangerTest.new Work(2, exchanger)).start(); } class Work implements Runnable{ private Exchanger<List<Integer>> exchanger ; private List<Integer> data =new ArrayList<Integer>(); private Integer num ; //线程 public Work(Integer num ,Exchanger<List<Integer>> exchanger ){ this.num = num ; this.exchanger = exchanger; } @Override public void run() { Random random = new Random(); data.add(random.nextInt(20) ) ; data.add(random.nextInt(20) ) ; data.add(random.nextInt(20) ) ; System.out.println("线程:"+num+ " 数据:"+ data); try { exchanger.exchange( data) ; System.out.println( "线程:"+num+ "数据更改结束。"+data); } catch (InterruptedException e) { e.printStackTrace(); } } } }
结果:
线程:1 数据:[6, 19, 19] 线程:2 数据:[1, 1, 0] 线程:1数据更改结束。[6, 19, 19] 线程:2数据更改结束。[1, 1, 0]
相关推荐
- `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...
Exchanger是一个数据交换工具,允许两个线程之间进行数据交换。当两个线程都到达Exchanger的交换点时,它们可以交换数据,然后继续执行。 7. **Callable、Future和FutureTask** - `Callable`接口类似Runnable,但...
Exchanger的核心功能是让两个线程在一个同步点相遇,进行数据交换。当一个线程调用`exchange`方法并传递自己的数据时,它会等待另一个线程也调用`exchange`并携带数据。一旦两者都到达同步点,它们就会交换各自的...
在Java并发编程中,Exchanger是一个非常有用的工具类,它允许两个线程间进行数据交换。这个类在处理需要同步的交互式任务时特别有用,比如在多阶段处理或者需要线程间协作的情况。Exchanger的工作原理就像一个中介,...
因此,`Exchanger`在特定的并发场景下非常有用,例如在两个处理阶段之间需要交换数据的情况,或者需要在两个线程之间同步某些计算结果时。但必须谨慎使用,以防止出现死锁或不期望的行为,特别是当有多个线程可能...
Exchanger类可以作为两个线程交换对象的同步点,只有当每个线程都在进入exchange()方法并给出对象时,才能接受其他线程返回时给出的对象。 Exchanger的使用实例解析可以分为以下几个方面: 1. Exchanger的基本使用...
当一个线程调用`exchange()`方法时,它会阻塞,直到另一个线程也调用了`exchange()`,然后两个线程可以交换数据。 - `exchange(V x)`:将当前线程持有的值x与另一个线程持有的值进行交换。如果另一线程已经准备好...
6. ** Phaser 和 Exchanger**:Java并发包中的高级同步工具,Phaser可以实现线程间的分阶段协调,Exchanger则用于两个线程之间交换数据。 7. **BlockingQueue**:队列实现的一种,提供了线程安全的数据结构,可以...
- **死锁定义**:两个或多个线程互相等待对方释放资源,导致无法继续执行的状态。 - **死锁的四个必要条件**:互斥条件、请求与保持条件、不剥夺条件和循环等待。 - **避免死锁的方法**:资源预分配、死锁预防、...
这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。 两个线程都调用exchange方法之后,传入的参数就会交换。 类定义 public class ...
Exchanger用于两个线程之间交换对象;ArrayBlockingQueue是一个有界阻塞队列;而Lock、Condition和Semaphore提供了更细粒度的控制和更灵活的线程同步机制。 3. Java并发编程API使用:在提供的内容中,还有定时器...
- **Exchanger**:用于两个线程间的数据交换,当双方都准备好数据后才进行交换。 - **BlockingQueue**:阻塞队列,线程在队列为空时会阻塞,直到有元素可用;队列满时,生产者线程也会被阻塞。 - **CyclicBarrier...
Java Exchanger是Java 5引入的并发类,用来实现两个线程之间的对象交换。Exchanger顾名思义,就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的...
Exchanger是两个线程交换对象的同步点。阻塞队列结合了线程安全的队列和阻塞机制,使得生产者和消费者能够更协调地工作。而同步集合类提供了线程安全的集合实现。 在多线程技术的实际应用中,例如Android应用开发和...
本文将深入探讨这两个主题,并结合实例进行详细讲解。 首先,我们来看Java集合。集合是Java提供的一种数据结构,用于存储多个对象。Java集合框架包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、...
Java提供了一些高级同步工具,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时锁)和Exchanger(交换器),它们提供了更灵活的线程同步方式。 四、线程池 Java的ExecutorService和...
Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...
【Exchanger详解】Exchanger是另一个并发工具类,它用于两个线程之间交换数据。Exchanger提供一个同步点,当两个线程都到达同步点时,它们可以交换它们的数据。这种机制适用于一对一线程间的协作,例如在多阶段计算...
顾名思义Exchanger让两个线程可以互换信息。用一个例子来解释比较容易。例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,然后通过Exchanger双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水...