コースワークの一部としてロックを使用してカスタムバリアクラスの実装を行う必要がありました。 LockBarrier
クラスをテストするには、次のテストコードを用意しました。それは正しく働いていますが、それが適切なやり方であるかどうかは心配です。私ができる改善、特にクラスの構造化をお勧めしますか?私は自分のコーディング方法が正しいとは思わない。どんな提案も大歓迎です。カスタムバリアのテストクラスの設計
public class TestDriver
{
private static LockBarrier barrier;
static class Runnable1 implements Runnable
{
public Runnable1()
{ }
public void run()
{
try
{
System.out.println(Thread.currentThread().getId()+" lazy arrived at barrier");
Thread.sleep(10000);
barrier.await();
System.out.println(Thread.currentThread().getId()+" passed barrier");
}
catch (InterruptedException ie)
{
System.out.println(ie);
}
}
}
static class Runnable2 implements Runnable
{
public Runnable2()
{ }
public void run()
{
try
{
System.out.println(Thread.currentThread().getId()+" quick arrived at barrier");
//barrier.await(1,TimeUnit.SECONDS);
barrier.await();
System.out.println(Thread.currentThread().getId()+" passed barrier");
}
catch (InterruptedException ie)
{
System.out.println(ie);
}
}
}
static class Runnable3 implements Runnable
{
public Runnable3()
{ }
public void run()
{
try
{
System.out.println(Thread.currentThread().getId()+" very lazy arrived at barrier");
Thread.sleep(20000);
barrier.await();
System.out.println(Thread.currentThread().getId()+" passed barrier");
}
catch (InterruptedException ie)
{
System.out.println(ie);
}
}
}
public static void main(String[] args) throws InterruptedException
{
barrier = new LockBarrier(3);
Thread t1 = new Thread(new TestDriver.Runnable1());
Thread t2 = new Thread(new TestDriver.Runnable2());
Thread t3 = new Thread(new TestDriver.Runnable3());
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
}
}
しかし、私が見ると予想されるのは、LockBarrierに別のスレッドの処理を許可するよう通知するものです。組み込みのConditionクラスのようなことをしているのであれば、signal()が呼び出されることが期待されるでしょう。 –
signalAll()は、LockBarrierのawait()実装内で実行されます。すべてのスレッドがバリアに到達したら、signalAllが完了しました。それほど冗長ではないとあなたは何を提案しますか? –
私の答えはどうでしたか?それは役に立ちましたか? – Toby