LinkedBlockingQueueシミュレーション部屋の席取り問題

4721 ワード

質問説明:10部屋あると仮定し、各部屋に5席あります.これらの席は空いているかもしれないし、人が座っているかもしれないし、部屋の外にはたくさんあります.  の人が空席を待っていて、部屋の中の人はいつでも離れるかもしれません. そのため、部屋の空きをスキャンし続け、暇があれば席を奪う.
ブログ http://sprite311.iteye.com/blog/2033655
 
解決方法:
1マルチラインのセキュリティ問題に関し、LinkedBlockingQueueはjava.util.concurrentパッケージの下のスレッドの安全なブロックキューであることを調査した.
2部屋の座席は生産者の製品に似ています.
3 1つのキューは1つの部屋をシミュレートし、複数の部屋がキュー配列を使用してシミュレートされる.
4生産者はキューにデータを置く(人が部屋に入る)offer()メソッドを使用し、put()メソッドを使用しない.put条件が満たさない場合はブロックされるからである.
5 Randomを使用して、人がランダムにある部屋に並んでいるのをシミュレートします.
 
コード:
             
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 
 * 
 *   :    10   ,     5   。         ,      ,             ,           ,
 *                             。 
 *    :   
 *     :2014-3-19   4:34:32
 * blog:http://sprite311.iteye.com/
 * 
 */
public class MultiRoomSeatCompetition {
	private static int roomCount = 10;

	public static void main(String[] args) {
		//          
		LinkedBlockingQueue<String>[] roomArray = new LinkedBlockingQueue[roomCount];
		for (int i = 0; i < roomCount; i++) {
			roomArray[i] = new LinkedBlockingQueue<String>(5);
		}
		System.out
				.println("   " + roomArray.length + "   -------------------。");
		// System.out.println(roomArray[0].size());
		Consumer c11 = new Consumer("   01 ", roomArray, roomCount);

		Producer p11 = new Producer("   01 ", roomArray, roomCount);
		Producer p22 = new Producer("   02 ", roomArray, roomCount);
		Producer p33 = new Producer("   03 ", roomArray, roomCount);
		Producer p44 = new Producer("   04 ", roomArray, roomCount);
		Producer p55 = new Producer("   05 ", roomArray, roomCount);
		Producer p66 = new Producer("   06 ", roomArray, roomCount);
		Producer p77 = new Producer("   07 ", roomArray, roomCount);
		Producer p88 = new Producer("   08 ", roomArray, roomCount);
		Producer p99 = new Producer("   09 ", roomArray, roomCount);

		ExecutorService service = Executors.newCachedThreadPool();

		service.submit(c11);

		service.submit(p11);
		service.submit(p22);
		service.submit(p33);
		service.submit(p44);
		service.submit(p55);
		service.submit(p66);
		service.submit(p77);
		service.submit(p88);
		service.submit(p99);
	}
}

/**
 *     (     :        )
 */
class Producer implements Runnable {
	private String pname;
	private LinkedBlockingQueue[] roomArray;
	private int roomCount;

	public Producer(String pname, LinkedBlockingQueue[] roomArray, int roomCount) {
		this.pname = pname;
		this.roomArray = roomArray;
		this.roomCount = roomCount;
	}

	public void run() {
		try {
			while (true) {
				UUID productID = UUID.randomUUID();
				Random r = new Random();
				int i = r.nextInt(roomCount);
				boolean isEnter = roomArray[i].offer(String.valueOf(productID));
				if (isEnter) {
					System.out.println(" " + i + "     " + productID + "    "
							+ i + "  ,      " + roomArray[i].size() + "  ");
				}
				// Thread.sleep(500);
			}
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
}

/**
 *     :           
 */
class Consumer implements Runnable {
	private String cname;
	private LinkedBlockingQueue[] roomArray;
	private int roomCount;

	public Consumer(String cname, LinkedBlockingQueue[] roomArray, int roomCount) {
		this.cname = cname;
		this.roomArray = roomArray;
		this.roomCount = roomCount;
	}

	public void run() {
		try {
			while (true) {
				Random r = new Random();
				int i = r.nextInt(roomCount);
				String product = (String) roomArray[i].take();
				System.out.println(product + "     " + i + "  ,      "
						+ roomArray[i].size() + "  ");
				Thread.sleep(5000);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 
存在する問題:もし部屋がいっぱいで、ある人が中に入ることができなかったら、彼は捨てられました--!集合を守って、部屋に入れて失敗した人、集合を空にして新しい人を生産できると思います.