кросс-нить - PullRequest
       16

кросс-нить

5 голосов
/ 25 мая 2011

Итак, я новичок в Java, я немного программировал на c.Я пытаюсь создать виртуальную сеть узлов, каждый узел должен быть потоком.Узлам разрешено общаться только с соседними узлами.будет главный узел, который может общаться с любым узлом, но узлам придется общаться друг с другом, чтобы вернуться к главному узлу.соседи мастер-узлов могут общаться с мастер-узлом.

Изначально я собирался сохранить список узлов в массиве, но потом понял, что все узлы должны быть там, в собственном потоке.

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

вот мои репозитории git, если вы хотите посмотреть на код, который я получил сейчас.

https://github.com/fieldju/cs372_project

в CI создал программу, которая использовала каналы, чтобы дети могли общаться друг с другом, и сервер соединял клиентов, но в этой задаче узлы должны были иметь p2p-связь, поскольку большинство из нихне может напрямую связаться с главным узлом / сервером


Просто обновление для тех, кто смотрит на это и хочет увидеть результаты.Я установил и запустил узлы, и вы можете проверить код на

https://github.com/fieldju/cs372_project

Я все еще работаю над вектором расстояния и некоторыми другими вещами, но к концуна следующей неделе все должно быть сделано.

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

Я изначально собирался оставить список массивов узлов, но тогда я понял, что все узлы должны быть есть собственная нить.

Вы можете сохранить массив потоков, он все равно будет поддерживать поток на узел с той же логической структурой.

как мне передать информацию обратно в вперед между потоками в Java.

Если потоки находятся в одном и том же процессе, то сокеты определенно являются излишним. Я бы использовал один или несколько ConcurrentLinkedQueue экземпляров для отправки / вывода сообщений.

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

Несколько советов по реализации

Оберните всю логику для сообщений о маршруте в классе - давайте назовем этот класс VirtualNetwork. VirtualNetwork имеет дело со всеми экземплярами ConcurrentLinkedQueue и предлагает API методов для всех потоков для отправки / получения сообщений. Сделайте один экземпляр класса VirtualNetwork доступным для всех узлов - передав ссылку на него в конструкторе Thread.

Это эскиз того, каким будет ваш класс NodeThread. Обратите внимание, что классы VirtualNetwork и Message - это классы, которые вы должны реализовать самостоятельно.

class NodeThread extends Thread {

    private int nodeId;
    private VirtualNetwork network;

    public NodeThread(int nodeId,VirtualNetwork network) {
        this.network = network;
        this.nodeId = nodeId;
    }
    public void run() {
        /* when you have to send */
        int nodeReceptor = this.nodeId -1; /* neighbor in the array of threads */
        Message m = new Message(this.nodeId,nodeReceptor);
        m.setContent(10);
        network.send(m);

        /* when you have to receive */
        Message m = network.receive(this.nodeId);
        /* it's your decision to implement this in a blocking way or not */
    }
} 
1 голос
/ 25 мая 2011

Простой (если не оптимальный) способ начать - создать BlockingQueue для каждой пары потоков, которым необходимо передавать значения в одном направлении (если это двунаправленный, вам нужно вдвое больше).

0 голосов
/ 25 мая 2011

Вы можете определенно использовать Сокеты . Есть несколько обучающих программ / описаний здесь и здесь . Ваше описание проекта предполагает, что установка клиент / сервер будет работать хорошо, так как у вас есть центральный «главный узел». Главным будет сервер, а другие потоки смогут подключаться к главному / серверу для получения своих обновлений.

...