2015-11-11 5 views
0

Мне нужно ваше мнение или альтернативное решение проблемы, которая у меня есть. У меня есть следующий код:Связь между двумя потоками

ThreadA создает ThreadB и дает B его интерфейс, поэтому ThreadB может использовать это. Когда ThreadB использует методы из интерфейса ThreadA, можно обработать результат. Является ли это правильным способом обработки связи? Если нет, то как это будет правильно?

public class ThreadA implements ThreadInterface { 

    public ThreadA() { 

     ThreadB b = new ThreadB((ThreadInterface) this); 
     b.start(); 
    } 

    @Override 
    public void processFinished(int result) { 
     // Do something with the result 
    } 

} 


public interface ThreadInterface { 

    void processFinished(int result); 
} 


public class ThreadB extends Thread { 

    ThreadInterface ti; 

    public ThreadB(ThreadInterface pTi) { 
     ti = pTi; 
    } 

    @Override 
    public void run() { 
     int result = 0; 

     // ... do things and save them into result 
     ti.processFinished(result); 
    } 
} 
+0

Что вы делаете, как сказал в своем ответе @TimB, это выполнение динамического (потому что оно определено во время выполнения) кода (метод 'processFinished') в ThreadB. Это не то же самое, что и код выполнения ('processFinished') в ThreadA. –

+0

Есть ли что-нибудь, что можно сделать в ThreadA, а ThreadB - это все? Если нет, не используйте несколько потоков. – zapl

+0

Передача 'this' в другой поток в конструкторе объекта является плохой практикой. Это позволяет другому потоку получить доступ к новому объекту в незастроенном состоянии. Google для «java утечки этого» для получения дополнительной информации. –

ответ

1

Когда поток в Java выполняет метод в другом объекте, был ли сделан этот объект в его собственной или другой поток будет выполнять его в своем собственном потоке. Память между глобальными переменными распределяется между потоками, поэтому, если вы измените переменную в ThreadB, которую использует ThreadA, она изменится для обоих потоков. То, что вы делаете, - это организованный способ сделать это, поэтому нет никакой разницы. Если вы хотите, чтобы сообщения передавались между потоками, как сказал другой ответ, некоторый тип очереди был бы хорош.

0

Ваш пример не отображает любой связь между потоками.

A Thread не является нитью. A thread - это независимое выполнение вашего кода. A Thread - объект Java, который можно использовать для создания (start()) и управлять жизненным циклом нити .

Когда ваш метод запуска ThreadB вызывает ti.processFinished(result), это не взаимодействие между потоками. processFinished (...) вызов происходит в тот же самый поток, который сделал звонок.

Никакой связи не происходит, если processFinished() не обновляет некоторую общую переменную, к которой будет обращаться другой поток. Поскольку вы не указали нам общую переменную (или что-либо, что действительно делает processFinished(), или то, что делает другой поток после запуска ThreadB), вы не показали нам никакой связи.


FYI, один из самых универсальных средств связи между потоками, чтобы они разделяют ArrayBlockingQueue. Один поток может помещать сообщения в очередь, а другой поток может получать сообщения из очереди и действовать на них.

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