Я знаю, что поток id просто длинный, и он не будет работать таким образом, так как я могу ссылаться на поток с id, который я получаю в аргументах функций?
Вы действительно не можете делать то, что хотите. Однако вы можете сохранить карту идентификатора потока для связанного класса Thread
или Runnable
и использовать его для поиска идентификатора.
Thread thread = new MyThread();
thread.start();
idMap.put(thread.getId(), thread);
Правильный способ сделать это - определить свой собственный класс и обработать объект вместо идентификатора потока. Рекомендуется использовать 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
) затем помещает сущность в очередь, и поток вытягивает ее.
Ну * почему * вы пытаетесь использовать потоки таким образом в любом случае, вместо того, чтобы передавать ссылку «Thread»? Также не совсем понятно, что вы подразумеваете под «У меня есть этот член потока» - и почему вы пытаетесь синхронизировать с примитивным значением ... –
Чтобы уточнить, расширили ли вы класс «Thread», в который вы добавили поле 'a'? Или у вас есть другой класс, у которого есть поле 'a'? –
threadWithMemberA extends Thread – rluks