- 简介:
可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为SynchronousQueue的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。
Exchanger提供的是一个交换服务,允许原子性的交换两个(多个)对象,但同时只有一对才会成功。
- 实例
现在启动两个线程,分别发送一个信息,然后通过exchanger交换信息。
代码:
1 public class ExchangerTest { 2 public static void main(String[] args) { 3 ExecutorService threadPool = Executors.newCachedThreadPool(); 4 final Exchanger exchanger = new Exchanger(); 5 6 threadPool.execute(new Runnable() { 7 8 @Override 9 public void run() { 10 String date1 = "love"; 11 System.out.println("Thread "+Thread.currentThread().getName()+"正在把数据"+date1+"放入!"); 12 try { 13 Thread.sleep(new Random().nextInt(1000)); 14 } catch (InterruptedException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } 18 String date2 = null; 19 try { 20 date2 = (String) exchanger.exchange(date1); 21 } catch (InterruptedException e) { 22 // TODO Auto-generated catch block 23 e.printStackTrace(); 24 } 25 System.out.println("Thread "+Thread.currentThread().getName()+"得到数据"+date2); 26 } 27 }); 28 threadPool.execute(new Runnable() { 29 30 @Override 31 public void run() { 32 String date1 = "hate"; 33 System.out.println("Thread "+Thread.currentThread().getName()+"正在把数据"+date1+"放入!"); 34 try { 35 Thread.sleep(new Random().nextInt(1000)); 36 } catch (InterruptedException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 String date2 = null; 41 try { 42 date2 = (String) exchanger.exchange(date1); 43 } catch (InterruptedException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 System.out.println("Thread "+Thread.currentThread().getName()+"得到数据"+date2); 48 } 49 }); 50 51 threadPool.shutdown(); 52 } 53 }
Exchanger实现的是一种数据分片的思想,这在大数据情况下将数据分成一定的片段并且多线程执行的情况下有一定的使用价值。