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を使用して、人がランダムにある部屋に並んでいるのをシミュレートします.
コード:
存在する問題:もし部屋がいっぱいで、ある人が中に入ることができなかったら、彼は捨てられました--!集合を守って、部屋に入れて失敗した人、集合を空にして新しい人を生産できると思います.
ブログ 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();
}
}
}
存在する問題:もし部屋がいっぱいで、ある人が中に入ることができなかったら、彼は捨てられました--!集合を守って、部屋に入れて失敗した人、集合を空にして新しい人を生産できると思います.