8

別のスレッドに通知する最良の方法を知りたいです。たとえば、バックグラウンド スレッドがあります。

public void StartBackgroundThread(){
new Thread(new Runnable() {         
        @Override
        public void run() {
            //Do something big...
            //THEN HOW TO NOTIFY MAIN THREAD?
        }
    }).start();
}

終了したら、メインスレッドに通知する必要がありますか? 誰かがこれを行う最善の方法を知っていれば、私はそれを感謝します!

4

5 に答える 5

3

典型的な答えはBlockingQueueです。BackgroundThread(プロデューサーと呼ばれることが多い) と(コンシューマーと呼ばれることが多い) の両方MainThreadが、キューの単一のインスタンスを共有します (おそらく、インスタンス化されたときに取得されます)。新しいメッセージがあるたびにBackgroundThread呼び出し、 「queue.take() BlockingQueue ArrayBlockingQueue」を呼び出します。queue.put(message)MainThreadwhich will block until there's a message to receive. You can get fancy with timeouts and peeking but typically people want ainstance such as

于 2013-01-15T01:55:13.337 に答える
3

純粋にあなたの質問に基づいて、これを行うことができます:

public class test
{
  Object syncObj = new Object();

  public static void main(String args[])
  {
    new test();
  }

  public test()
  {
    startBackgroundThread();

    System.out.println("Main thread waiting...");
    try
    {
      synchronized(syncObj)
      {
        syncObj.wait();
      }
    }
    catch(InterruptedException ie) { }
    System.out.println("Main thread exiting...");
  }

  public void startBackgroundThread()
  {
    (new Thread(new Runnable()
    {
      @Override
      public void run()
      {
        //Do something big...
        System.out.println("Background Thread doing something big...");
        //THEN HOW TO NOTIFY MAIN THREAD?
        synchronized(syncObj)
        {
          System.out.println("Background Thread notifing...");
      syncObj.notify();
        }
        System.out.println("Background Thread exiting...");
      }
    })).start();
  }
}

この出力を参照してください

PS C:\Users\java> javac test.java
PS C:\Users\java> java test
Main thread waiting...
Background Thread doing something big...
Background Thread notifing...
Background Thread exiting...
Main thread exiting...
于 2013-01-15T03:47:23.333 に答える
1

notify() を呼び出すだけです

public void run() { 
    try { 
        while ( true ) { 
            putMessage(); 
            sleep( 1000 ); 
        } 
    }  
    catch( InterruptedException e ) { } 
} 

private synchronized void putMessage() throws InterruptedException { 
    while ( messages.size() == MAXQUEUE ) 
        wait(); 

    messages.addElement( new java.util.Date().toString() ); 
    notify(); 
} 
于 2013-01-15T01:21:47.087 に答える
1

「メインスレッドに通知」することはできません。

最善の方法はExecutorService、たとえば次のように を使用することです。

 import java.util.concurrent.*;

 // in main thread
 ExecutorService executorService = Executors.newSingleThreadExecutor();

 Future<?> future = executorService.submit(new Runnable() {         
    @Override
    public void run() {
        //Do something big...
    }
});

future.get(); // blocks until the Runnable finishes

クラスは非同期操作を処理するために特別に作成されており、そこに含まれるすべてのコードは既に作成されており、防弾仕様になっています。

編集

待機中にメイン スレッドをブロックしたくない場合は、別のスレッド内で待機します。

 final Future<?> future = executorService.submit(new Runnable() {         
    @Override
    public void run() {
        //Do something big...
    }
});

new Thread(new Runnable() {         
    @Override
    public void run() {
        future.get(); // blocks until the other Runnable finishes
        // Do something after the other runnable completes
    }
}).start();
于 2013-01-15T02:00:28.570 に答える
0

あるスレッドが別のスレッドに通知するのは、良い方法ではありません。スレーブ スレッドを機能させる 1 つのマスター スレッドを用意することをお勧めします。スレーブ スレッドは常に実行されており、作業を受け取るまで待機します。2 つの列を描画して、各スレッドがどこで待機する必要があるかを正確に判断することをお勧めします。

    public void run() 
    {
    //Do something big...
    synchronized(this)
    {
        done = true;
    }
    }

Java には、これを非常に簡単に確認できるライブラリと、キューを使用しExecutorServiceた次のポスト Producer/Consumer スレッドが含まれています。

于 2013-01-15T01:23:04.947 に答える