程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java多線程-Exchanger,多線程-exchanger

java多線程-Exchanger,多線程-exchanger

編輯:JAVA綜合教程

java多線程-Exchanger,多線程-exchanger


  • 簡介:

  可以在對中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給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實現的是一種數據分片的思想,這在大數據情況下將數據分成一定的片段並且多線程執行的情況下有一定的使用價值。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved