2011-11-12 10 views
4

この質問はインタビューで尋ねられました。1つのスレッドを完了まで実行する

同じ優先度ののスレッドがいくつかありますが、その中の特定のスレッドが最初に完了するようにするにはどうすればよいですか?

あなたは、他のスレッド..

EDITに待機()と睡眠()トリックを使用することはできません。他のスレッドを変更 は許可されていません。

+0

スレッド内でmaxに設定するのはルール内ですか? – dbjohn

+0

@dbjohn - 優先度は変更できません –

+1

@dbjohn優先度を変更しても何も保証されません。 –

答えて

1

それはresume()そして、あなたが最初に終了したい1にjoin()、その後、非推奨となり、本質的に安全ではない(ので、あなたはそれを使用するべきではありません)がありますが、他のすべてのスレッドをsuspend()可能性があります。

私はそれが彼らが何をしようとしているのか分かりません。そうであれば、私はインタビューのスキルかJavaの知識かを疑うだろう。

私が考えることができる「良い」ソリューションでは、スレッドが実行されるコードを少なくともわずかに変更する必要があります。これらのスレッドを変更するには限界に達していませんか?

+0

はい。私が正しいと思えば、問題はスレッドを修正するための限界に達しないように形成されました。私はJVMの観点から何かできることのようなヒントを与えられました。 –

+0

@ johnbk、 "JVMの観点から"変更できるものは、コードの変更または追加が必要です。 –

6

は、一つのスレッドjoin()を持っている他の

+0

これは、制御しようとしているスレッドを変更する必要があります。 –

+2

待機中のスレッドのコードを変更するだけで済みます。 –

2

あなたがスレッドを変更することはできませんので、あなたが待機中のスレッドを中断し、最初に完了しなければならないスレッドで()に参加する必要があります。


私は完全を期すため(スレッドの変更についての明確化が追加される前に、私は答えた)が、問題の明確化制約の下で、これらのメソッドが禁止されるだろう次のことを残しておきます:

は、それぞれを持っています他のスレッドは最初に完了する必要があるスレッドでjoin()を呼び出します。これにより、スレッドが終了するまで待つが、sleep()ループよりもCPU時間がかなり短くなる。 AfterThreadの実行方法で

Thread first = new FirstThread(); 
Thread after1 = new AfterThread(first); 
Thread after2 = new AfterThread(first); 

:また参加し、タイムアウトを渡すことができ

first.join(); 
// Do the rest of this thread's code 

()。

別の方法として、特定の名前付きスレッドのみが取得できるロックを作成し、その名前付きスレッドが一度取得して解放するまでの方法があります。

関連する問題