如何在java中访问线程成员?

时间:2013-05-07 16:15:57

标签: java multithreading reference

我有这个线程的成员

public int a;

我将线程id传递给静态函数,我希望在其中执行类似

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

我知道,线程id只是很长而且它不会以这种方式工作,所以如何引用带有id的线程我在函数参数中获取?

1 个答案:

答案 0 :(得分:1)

  

我知道,线程id只是很长而且它不会以这种方式工作,所以如何引用带有id的线程我在函数参数中获取?

你真的不能做你想做的事。您可以自己将线程ID的映射保存到关联的ThreadRunnable类,然后使用它来查找ID。

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

执行此操作的正确方法是定义自己的类并处理对象而不是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上设置一个封装过程的setter:

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

另一种方法是让线程可以与通知线程共享BlockingQueue,从而使您免于等待/通知。主线程(或任何调用function的人)然后将一个实体放入队列,线程将其拉出。