2016-05-11 10 views
0

私のプロジェクトグループはトラフィックシミュレーションを作成しており、スレッドを適切に分割する方法がわかりません。以下の1つの変数デルタを持つ更新メソッドがあります。今度は両方のループを分割したいと思っています(1番目と2番目の更新で車両を更新し、すべての交差点などを更新します)。これらを2つのスレッドに分割しても、デルタに同じ値を与えることはできますか?これも可能ですか?メソッド全体を1つのスレッドに入れても問題はありませんが、分割することはできません。スレッドを分割してもJava内の共通変数を保持します

EDIT:デルタは常に変化する変数です(時間が経過した)。これは、同じデルタを使用するのが難しい理由です。

public void update(double delta){ 

    for (int i = 0; i < this.vehicles.size(); i++) { 
     this.vehicles.get(i).update(delta); 
    } 

    for (int i = 0; i < this.updateables.size(); i++) { 
     this.updateables.get(i).update(delta); 
    } 
    this.simulationTime += delta; 
} 
+0

何を並行して実行しようとしていますか?あなたは車を更新したいですか?その後、テーブルを更新し終わったら? – matt

+0

'vehicle.get(i).update(delta)'の間にデルタが変わると言っていますか?または、そのタスクがデルタの単一の値で完了するようにしたいですか? – matt

答えて

0

this.vehiclesがListの場合、またはこれらの行に沿ったものなら、パラレルストリームを作成します。

this.vehicles.stream().parallel().forEach(v->v.update(delta)); 

これらはパラレルで実行する必要があります。

さらに、プロセスをより詳細に制御したい場合は、エグゼキュータ・サービスを使用してください。

ExecutorService service = Executors.newFixedThreadPool(4); 

各タスクを送信します。

List<Future<?>> futures = this.vehicles.map(
    v->service.submit(
     ()->v.update(delta) 
    ) 
).collect(Collectors.toList()); 

次に、すべてのタスクが完了していることを確認します。

futures.forEach(future->{ 
    try{ 
     future.get(); 
    }catch(Exception e){ 
     //two types of exceptions they both should be handled appropriately. 
    } 
}); 
0

私が正しく理解している場合、デルタは異なる場合があります。

あなたがここに自動車の一例には2つの別々のスレッドを作成することができます。

public void update(double delta) { 

    Thread t = new VehiclesUpdater(delta, vehicles); 
    t.start(); 


    //the same here for the Updateables 
} 

EDIT: を次のようにただやる、代わりにループを呼び出すのでは、その後

public class VehiclesUpdater extends Thread { 

    double delta; 
    List<Vehicle> vehicles; 

    public VehiclesUpdater(double delta, List<Vehicle> vehicles) { 
     this.delta = delta; 
     this.vehicles = vehicles; 
    } 

    @Override 
    public void run() { 
     for(int i=0;i<vehicles.size();i++) { 
      vehicles.get(i).update(delta); 
     } 
    } 


} 

をあなたは時間の問題に関心があるので、Observer/Observable-アプローチを試みることができます。

あなたの車クラスとあなたの更新可能クラスはObserverクラスを拡張してみましょう:デルタ値(複数可)を計算し、クラスでObserver

、観察可能なインタフェースを実装します。それが変化した場合、setChanged()メソッドを呼び出し、その後、それまでのparamとして、デルタまたはダブルラッパーをnotifyObservers()方法とを与える:あなたの車クラスで

Double wrapper = new Double(delta); 
setChanged(); 
notifyObservers(wrapper); 

を、あなたはオブザーバーのupdate-methodを上書きする必要があります。

// 
@Override 
public void update(Observable o, Object arg) { 
    this.updateDelta((Double)arg); 
} 

私はちょうど明確化のために、あなたのオリジナルの更新方法updateDeltaと呼ばれる - 限り、あなたの更新方法は、と別のparam(ダブル)を使用し、同じ方法で、頭を持っていますなどの方法-のオーバーロードここを使用することが可能でなければなりませんpublic void update(...)。

+0

この場合、デルタを更新メソッドに渡しますが、デルタは常に変化します(速度と距離などの計算に時間がかかります)。このソリューションがうまくいくとは思わないでしょうか? –

+1

しかしあなたはあなたのポストにも行った。あなたのupdate-methodはparamとしてdeltaを持っていて、各車両で使用され、更新可能です。 – Supahupe

関連する問題