-2

私はこのスレッドのメンバーを持っています

public int a;

次のようなことをしたい静的関数にスレッドIDを渡しています

function(long threadId, int a){
    synchronized (threadId){
            threadId.a = a;
            threadId.notify();
    }
}

スレッドIDが長くてこのように機能しないことはわかっています。関数の引数で取得したIDでスレッドを参照するにはどうすればよいですか?

4

1 に答える 1

1

スレッドIDが長くてこのように機能しないことはわかっています。関数の引数で取得したIDでスレッドを参照するにはどうすればよいですか?

やりたいことが本当にできない。Threadただし、関連付けられたスレッド IDまたはクラス自身へのスレッド ID のマップを保持し、Runnableそれを使用して ID を検索することができます。

  Thread thread = new MyThread();
  thread.start();
  idMap.put(thread.getId(), thread);

これを行う正しい方法は、独自のクラスを定義し、スレッド ID の代わりにオブジェクトを処理することです。Runnableを拡張するのではなく、実装することをお勧めしますThread。何かのようなもの:

public class MyRunnable impelments Runnable {
    public int a;
    ...
    public void run() {
       // code run in the thread
       synchronized (this) {
          this.wait();
       }
       System.out.println(a);
    }
}

次に、次のことができます。

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
...
public void function(MyRunnable runnable, int a) {
   synchronized (runnable){
       runnable.a = a;
       runnable.notify();
   }
}

MyRunnableプロセスをカプセル化するセッターを設定することをお勧めします。

public synchronized void setA(int a) {
   this.a = a;
   this.notify();
}

別の方法は、スレッドが通知スレッドと共有できるようにしてBlockingQueue、待機/通知からあなたを救うことです。次に、メイン スレッド (または を呼び出している人function) がエンティティをキューに入れ、スレッドがそれを引き出します。

于 2013-05-07T16:36:44.503 に答える