Передача сообщений между потоками java
имеется 2 задачи на тему передачи сообщений между потоками. 
Первый пункт задачи решил следующим образом
@Override
public void run() {
while (true) {
if (x == 1)
{
t.setX(1);
x = 0;
}
else
{
try {
Thread.currentThread().sleep(300);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
ta.append(x + "\n");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e1) {
stat.setText("Потоки прерваны");
return;
}
здесь t - ссылка на поток, которому нужно дальше передать значение.
Соответственно, алгоритм работы данной программы следующий: если у текущего потока x = 1, то передаем 1 следующему потоку, а себе устанавливаем x = 0, в противном же случае просто отправляем текущий поток в спячку. Не могу понять как переделать этот код для n-го количества потоков (второй пункт)
Ответы (1 шт):
Автор решения: DeMaz
→ Ссылка
Потоки можно добавить в динамический массив и с помощью него передавать сообщения по условию, например так:
public class Main{
static volatile List<MyThread> myThreads = new ArrayList<> ();
static final Object lock = new Object ();
public static void main (String[] args)
{
new MyThread ("foo", 3).start ();
new MyThread ().start ();
new MyThread ().start ();
new MyThread ().start ();
new MyThread ().start ();
}
static class MyThread extends Thread
{
String message;
static volatile int rounds;
public MyThread () {}
public MyThread (String message, int rounds)
{
this.message = message;
MyThread.rounds = rounds;
}
@Override
public void run ()
{
Main.myThreads.add (this);
while (rounds > 0)
{
if (this.message != null)
{
System.out.println ("Message: "
+ message
+ ". In thread - "
+ currentThread ()
+ ". Count = "
+ rounds);
sendMessageFurther ();
}
}
}
private void sendMessageFurther ()
{
synchronized (lock)
{
for (int i = 0; i < myThreads.size (); i++)
{
if (myThreads.get (i).equals (currentThread ()))
{
if (i < myThreads.size () - 1)
{
myThreads.get (i + 1).message = this.message;
this.message = null;
}
else
{
myThreads.get (0).message = this.message;
this.message = null;
MyThread.rounds--;
}
}
}
}
}
}
}