2013-05-07 2 views
-2

У меня есть этот элемент резьбыКак получить доступ к элементам потока в java?

public int a; 

Я передаю резьбу идентификатор статической функции, где я хочу сделать что-то вроде

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

Я знаю, что потоки идентификатор просто долго и он не работайте таким образом, так как я могу ссылаться на поток с id, который я получаю в аргументах функций?

+3

Ну * почему * вы пытаетесь использовать потоки таким образом в любом случае, вместо того, чтобы передавать ссылку «Thread»? Также не совсем понятно, что вы подразумеваете под «У меня есть этот член потока» - и почему вы пытаетесь синхронизировать с примитивным значением ... –

+0

Чтобы уточнить, расширили ли вы класс «Thread», в который вы добавили поле 'a'? Или у вас есть другой класс, у которого есть поле 'a'? –

+0

threadWithMemberA extends Thread – rluks

ответ

1

Я знаю, что поток 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) затем помещает сущность в очередь, и поток вытягивает ее.

+0

Спасибо за ответ, но я решил его, передав ссылку потока, вместо передачи id. – rluks

Смежные вопросы