Передача сообщений между потоками 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--;
                    }
                }
            }
        }
    }
}

}

→ Ссылка