-1

2 つの異なるスレッドでコードを記述したいと考えています。最初のものは何かを行い、2番目のものは特定の時間待機します。最初に終了したスレッドは、他のスレッドを中断する必要があります。私の問題は、最初に初期化したスレッドが2番目のスレッドにアクセス/中断できず、常に「シンボルが見つかりません」というエラーが発生することです。コード内のスレッドの位置を入れ替えても同じで、その逆です。両方のスレッドを「グローバル」にして、他のスレッドからアクセスできるようにする可能性はありますか? public void main 、 void run() などを配置する場所、可能であればコーディング例を示してください。そのため、コード自体を追加するだけで済みます。ありがとう

コード例:

    public class FTPUpload extends Thread {

      public static void main (String args[]) {
        _//some code_
        final Thread thread1 = new Thread(){;
          public void run() {
    _//code of thread1_
}  

final Thread thread2 = new Thread(){;
  public void run() {
   _//code of thread2_ 

}

thread1.start();
thread2.start();

       }
    }
4

4 に答える 4

0

あなたの質問は(現在?)少し漠然としているため、私の答えはあまり役に立たないかもしれません。しかし...

Thread最初にオブジェクトを宣言し、後で使用してみてください。したがって、お互いに知っている可能性があります。

于 2012-09-13T07:41:14.423 に答える
0

両方がアクセスできる bool static 変数を作成し、そのうちの 1 つが完了するとそれを true に設定できます。別の場所で、またはループにループがある場合は、各スレッドのジョブ中にこの変数をチェックする必要があります。例えば。

または、最初に終了したスレッドのどこかにダミーファイルを書き込み、両方のスレッドにファイルが存在するかどうかを確認し続けることもできます。主なアイデアは、両方がアクセスできる共有リソースを持つことです。

この質問を読むと、非常に有益です:静的変数はスレッド間で共有されますか?

私の考え いくつかの答えにはうまくいかないかもしれませんが、ファイルのあるものは実際にはうまくいくはずです。

于 2012-09-13T07:44:37.750 に答える
0

2 つのスレッド間で通信するための一般的なソリューションは、条件変数を使用することです。スレッド 1 は条件変数でブロックできます。その後、スレッド 2 が必要なことを実行し、スレッド 1 に移動するように伝えたい場合、スレッド 1 は条件変数を介してスレッド 1 に通知し、そのブロックを解放します。両方のスレッドを同じ条件変数で初期化する必要があります。ここに例があります。

両方のスレッドを他方が初期化されるまで待機させたい場合は、バリア同期 (Java では CyclicBarrier と呼ばれます) を使用してこれを実行できます。Thread1 が最初にバリア同期にヒットすると、他のスレッドがバリア同期にヒットするまでブロックされます。両方がバリア同期に達すると、処理が続行されます。ここに例があります。

条件変数とバリア同期はどちらもスレッド セーフであるため、それらを同期する必要があるかどうかを心配する必要はありません。

于 2012-09-13T08:00:39.223 に答える
0

一般的な原則は、両方のスレッドの外側でロックと条件を作成することです。最初のスレッドはロックを取得し、完了すると条件を通知します。2 番目のスレッドはロックを取得し、条件を待機します (必要に応じてタイムアウトを使用)。悪い計画である Thread.interrupt() に依存していることを非常に懸念しています。

final Lock lock = new ReentrantLock();
final Condition done = lock.newCondition();
...
// in thread 1 when finished
lock.lock();
try {
  done.signalAll();
} finally {
  lock.unlock();
}
...
// in thread 2 for waiting
lock.lock();
try {
  done.await(30,TimeUnit.SECONDS); // wait for the done or give up waiting after 30s
} finally {
  lock.unlock();
}

ロックを使用すると、両方のスレッドが共有オブジェクトの一貫したビューを確認できるようになりますが、 Thread.interrupt() は境界を通過したことを保証しません

改良は、CountDownLatch を使用することです

final CountDownLatch latch = new CountDownLatch(1);
...
// in thread 1
latch.countDown();
...
// in thread 2
latch.await(30,TimeUnit.SECONDS)

これにより、ロックが抽象化されます。

他の人は、ファイル システム上のファイルをスキャンするスピン ロックを効果的に提案しています。このようなアプローチは、スレッドの枯渇につながるか、ロックまたはラッチベースのソリューションよりもパフォーマンスが低下する可能性があります...ただし、1つのjvm内のスレッド間ではなくプロセス間では、ファイルベースは問題ありません

スレッド化を知っていると思われる場合は、「Java Concurrency In Practice」という本をお勧めします。書店に行き、本を開いて、33 ページのプログラムが何をするかを予測してみてください。そのページを読んだ後、本を購入することになります。

于 2012-09-13T08:07:47.147 に答える