我有这个线程的成员
public int a;
我将线程id传递给静态函数,我希望在其中执行类似
的操作function(long threadId, int a){
synchronized (threadId){
threadId.a = a;
threadId.notify();
}
}
我知道,线程id只是很长而且它不会以这种方式工作,所以如何引用带有id的线程我在函数参数中获取?
答案 0 :(得分:1)
我知道,线程id只是很长而且它不会以这种方式工作,所以如何引用带有id的线程我在函数参数中获取?
你真的不能做你想做的事。您可以自己将线程ID的映射保存到关联的Thread
或Runnable
类,然后使用它来查找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
的人)然后将一个实体放入队列,线程将其拉出。