私は、スレッドの私の知識はまだ、ええと、暫定的であるように、現在、並行プログラミングについて学ぶCSの学生です。
私はちょうど少しのスレッドで共有配列を更新するロジックにこだわっています。私は、スレッドの潜在的に無限の数は、常に、人々がに行くことができるシーティングエリアのアイデアをシミュレートするランダムな時間のために座って、その後、残すためにサイズ10のブール配列を更新することを可能にするプログラムを作成しています。ここに私のコードは次のとおりです。
class Viewer extends Thread{
private String name;
private int index;
volatile boolean[] seats;
Viewer(boolean[] st, String n){
seats = st;
name = n;
}
public void run() {
ViewingStand vs = new ViewingStand(seats);
this.index = vs.findSeat(name, seats);
try {
Thread.sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
seats = vs.leaveSeat(name, seats, index);
}
}
class ViewingStand{
private volatile boolean[] area; //the array used by threads
private int seatNo; //index of whatever area is being taken or left.
Random rand = new Random();
boolean found = false;
public ViewingStand(boolean st[]){
this.area = st;
}
public int findSeat(String s, boolean[] seats){
this.area = seats;
while(found == false) {
for(int i=0; i < area.length; i++) {
if(area[i] == true) {
found = true;
this.seatNo = i;
area[seatNo] = false;
System.out.println(s + " has found a seat.");
return this.seatNo;
}
}
System.out.println(s + " has started searching again.");
}
return -1; //should never reach this
}
public boolean[] leaveSeat(String s, boolean[] area, int n){
this.area = area;
this.area[n] = false;
System.out.println(s + " has left their seat.");
return this.area;
}
このプログラムの結果は、最初に10個の要素(私はメインプログラムから渡された配列のサイズ)を充填したばかりのアレイである、それらのスレッドは、「」配列が、明らかではない、私は前後に間に渡しているものと同じものを残します10日後に後続のすべてのスレッドが席を探して立ち往生としてViewingStand方法、両方。正しい方向に私を指すように、いくつかの入力を大好きです。ありがとうございました!
私が最初に並行性の問題を無視して、あなたは約求めている論理エラーのように思える何のためにまっすぐに行くよ- leaveSeat
設定されるthis.area[n] = false
-シートが取られていることを示すために思われる(あなたのfindSeat
メソッドが値であれば座席が空であると仮定しtrue
) 。
並行性の問題では:あなたは、あなたのループが席をチェックして問題を持っている可能性が高いです-それは、複数のスレッドが座席が空であるかを決定(そしてもしブロックに入る)することは可能だし、すべての「主張」と同じ席。あなたは、1つのインスタンスを作成する必要がありViewingStand
、それが席へのアクセス管理を持っている-のような並行性制御を使用しsynchronized
たり、複数のスレッドが同時に座席の状態を変更しないようにロックを。