view src/test/MultiThreadTee.java @ 191:b2f0cd0cff6c default tip

Added tag Version-1.0 for changeset 79046b4e5990
author Yu Taninari <you@cr.ie.u-ryukyu.ac.jp>
date Tue, 29 Nov 2011 15:52:44 +0900
parents a240b19b66f0
children
line wrap: on
line source

package test;

import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;

public class MultiThreadTee {

	static class Parent extends Thread {
		LinkedList<BlockingQueue<String>> clients = new LinkedList<BlockingQueue<String>>();


		BlockingQueue<String> accept() {

			// BlockingQueue<String> s = new  LinkedBlockingQueue<String>();
			BlockingQueue<String> s = new  SynchronousQueue<String>();
			clients.add(s);
			
			return s;

		
		}

		void put(String s) throws InterruptedException {
			for (BlockingQueue<String> queue : clients) {
				queue.offer(s);
				
			}
			
		}
		
	}


	
	static class Client extends Thread {
		Parent p;
		private BlockingQueue<String> queue;
		
		
		
		
		public Client(Parent p2) {
			p = p2;
		}

		public void run() {
			queue = p.accept();

			String item;
//			while(!(item = queue.poll()).equals("") ) {
			while(true) {
				try {
					item = queue.take();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					// System.out.println("wating");
					continue;
				}
				// if(item == null) continue;
				if(item.equals("")) return;
				System.out.println(item);
			}
		}
		
	}

	static public void main (String[] argv) throws InterruptedException {
		int num = 3;
		Parent p = new Parent();
		Client[] cs = new Client[num];
		for (int i=0; i < num; i++ ) {
			cs[i] = new Client(p);
		}

		p.start();
		for (int i = 0; i < num; i++) {
			cs[i].start();
		}
		p.put("TEST1");
		p.put("TEST2");
		p.put("TEST3");
		p.put("");

		p.join();
		for (int i = 0; i < num; i++) {
			cs[i].join();
		}

		
		
		
	}
}