线程中的同步辅助类Exchanger
Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。
允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法,就发生数据的交换,尽量不要在多(大于两条)线程之间进行数据的交换.
Exchanger可能在应用程序(遗传算法和管道设计)中很有用.
线程之间的数据交换:Exchanger
允许两条线程之间交换数据。Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法,就发生数据的交换。尽量不要在多(>2)条线程之间进行数据的交换。
exchange是一个阻塞方法,如果没有其他的线程和它换,就会一直等待着直到有一个线程也调用了exchange方法,然后它们两者交换.
Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用
如果是多条(大于2)线程使用exchange的方法就会发生数据错乱.exchange不管和它交换数据的是谁,它只管有人调用了这个exchange方法,就和其交换数据.
场景:
我卖包子,一个哥们要买包子,我把包子给他了.他把钱给我了.
1 import java.util.Random; 2 import java.util.concurrent.Exchanger; 3 import java.util.concurrent.TimeUnit; 4 5 public class ExchangerDemo { 6 7 public static void main(String[] args) { 8 final Exchanger<String> exchanger = new Exchanger<String>();//String 泛型 是交换的数据的数据类型 9 //for (int i = 0; i < 3; i++) {//如果是多条(大于2)线程使用exchange的方法就会发生数据错乱.exchange不管和它交换数据的是谁,它只管有人调用了这个exchange方法. 10 11 new Thread(new Runnable() { 12 13 @Override 14 public void run() { 15 16 try { 17 System.out.println(Thread.currentThread().getName() 18 + ": 卖包子。。。"); 19 TimeUnit.SECONDS.sleep(new Random().nextInt(5)); 20 String data1 = "包子"; 21 String data2 = exchanger.exchange(data1);//把包子给买包子的人 22 System.out.println(Thread.currentThread().getName() 23 + " : 拿到了" + data2); 24 25 } catch (InterruptedException e) { 26 e.printStackTrace(); 27 } 28 } 29 }).start(); 30 31 new Thread(new Runnable() { 32 33 @Override 34 public void run() { 35 36 try { 37 System.out 38 .println("-->" 39 + Thread.currentThread().getName() 40 + ": 买包子。。。"); 41 TimeUnit.SECONDS.sleep(new Random().nextInt(5)); 42 String data1 = "10元"; 43 String data2 = exchanger.exchange(data1);//把钱给卖包子的 44 System.out.println(Thread.currentThread().getName() 45 + " : 拿到了" + data2); 46 47 } catch (InterruptedException e) { 48 e.printStackTrace(); 49 } 50 } 51 }).start(); 52 // } 53 } 54 }
运行结果:
1 Thread-0: 卖包子。。。 2 -->Thread-1: 买包子。。。 3 Thread-0 : 拿到了10元 4 Thread-1 : 拿到了包子
如果把上面的for循环打开:
1 Thread-0: 卖包子。。。 2 -->Thread-1: 买包子。。。 3 Thread-2: 卖包子。。。 4 -->Thread-3: 买包子。。。 5 Thread-4: 卖包子。。。 6 -->Thread-5: 买包子。。。 7 Thread-5 : 拿到了10元 8 Thread-3 : 拿到了10元 9 Thread-2 : 拿到了10元 10 Thread-1 : 拿到了包子 11 Thread-4 : 拿到了包子 12 Thread-0 : 拿到了包子
作者:SummerChill 出处:http://www.cnblogs.com/DreamDrive/ 本博客为自己总结亦或在网上发现的技术博文的转载。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |