51
|
1 package test;
|
|
2
|
|
3 import java.util.LinkedList;
|
|
4 import java.util.concurrent.SynchronousQueue;
|
|
5
|
|
6 public class MultiThreadTee {
|
|
7
|
|
8 static class Parent extends Thread {
|
|
9 LinkedList<SynchronousQueue<String>> clients = new LinkedList<SynchronousQueue<String>>();
|
|
10
|
|
11
|
|
12 SynchronousQueue<String> accept() {
|
|
13
|
|
14 SynchronousQueue<String> s = new SynchronousQueue<String>();
|
|
15 clients.add(s);
|
|
16
|
|
17 return s;
|
|
18
|
|
19
|
|
20 }
|
|
21
|
|
22 void put(String s) throws InterruptedException {
|
|
23 for (SynchronousQueue<String> queue : clients) {
|
|
24 queue.put(s);
|
|
25
|
|
26 }
|
|
27
|
|
28 }
|
|
29
|
|
30 }
|
|
31
|
|
32
|
|
33
|
|
34 static class Client extends Thread {
|
|
35 Parent p;
|
|
36 private SynchronousQueue<String> queue;
|
|
37
|
|
38
|
|
39
|
|
40
|
|
41 public Client(Parent p2) {
|
|
42 p = p2;
|
|
43 }
|
|
44
|
|
45 public void run() {
|
|
46 queue = p.accept();
|
|
47
|
|
48 String item;
|
|
49 // while(!(item = queue.poll()).equals("") ) {
|
|
50 while(true) {
|
|
51 item = queue.poll();
|
|
52 if(item == null) continue;
|
|
53 if(item.equals("")) return;
|
|
54 System.out.println(item);
|
|
55 }
|
|
56 }
|
|
57
|
|
58 }
|
|
59
|
|
60 static public void main (String[] argv) throws InterruptedException {
|
|
61 int num = 3;
|
|
62 Parent p = new Parent();
|
|
63 Client[] cs = new Client[num];
|
|
64 for (int i=0; i < num; i++ ) {
|
|
65 cs[i] = new Client(p);
|
|
66 }
|
|
67
|
|
68 p.start();
|
|
69 for (int i = 0; i < num; i++) {
|
|
70 cs[i].start();
|
|
71 }
|
|
72 p.put("TEST1");
|
|
73 p.put("TEST2");
|
|
74 p.put("TEST3");
|
|
75 p.put("");
|
|
76
|
|
77 p.join();
|
|
78 for (int i = 0; i < num; i++) {
|
|
79 cs[i].join();
|
|
80 }
|
|
81
|
|
82
|
|
83
|
|
84
|
|
85 }
|
|
86 }
|
|
87
|