Поток Java останавливает выполнение там, где его не должно быть - PullRequest
2 голосов
/ 30 января 2012

Я пишу сеть распространения контента в Java. У меня есть класс Link для управления сокетами между двумя узлами в системе. Есть две программы, RouterNode и DiscoveryNode.

Когда запускается узел маршрутизатора, в первую очередь он пытается инициализировать соединение с узлом обнаружения:

public RouterNode(int num)
{
    myNumber = num;
    input = new Scanner(System.in);

    try {
        discoveryServer = new Socket("MONDAY-PC", 60111);
        myServerLink = new Link(this, discoveryServer);
    } catch (IOException e) {
        System.out.println("Socket could not be opened. Node terminating.");
        System.exit(-1);
    }

В конструкторе есть что-то еще, но моя проблема не позволяет моей программе пройти этот блок try.

Конструктор класса ссылки (вызывается в строке 'myServerLink = new Link (this, discoveryServer);) выглядит так:

public Link(Node n, Socket s)
{
    parentNode = n;
    regSocket = s;
    try {
        out =  new DataOutputStream(regSocket.getOutputStream());
        in = new DataInputStream(regSocket.getInputStream());
    } catch (IOException e) {
        System.out.println("Data Streams could not be created on the link.");
        e.printStackTrace();
    }


    new Thread(new LinkListenerThread(this, in)).run();
}

где последняя строка этого конструктора запускает новый поток, предназначенный для прослушивания в сокете входящих сообщений, которые передаются.

Метод run () в LinkListenerThread помечается следующим образом:

@Override
public void run()
{
    byte[] message;     

    System.out.println("Link now active and running.");
    while(!done)
    {
        System.out.println("attempting to read from socket...");

        try {

            // read now many bytes the following message will be
            byte[] messageLengthBytes = new byte[4];
            in.read(messageLengthBytes, 0, 4);

Моя проблема в том, что, когда я создаю экземпляр ссылки с узла маршрутизатора, его выполнение останавливается из-за того, что LinkListenerThread блокирует при вызове in.read (). Этот слушатель работает в отдельном потоке, поэтому я не уверен, является ли это чем-то странным с потоками, или это просто пример моего отсутствия опыта работы с ними.

У меня есть другой экземпляр в моей программе, где я читаю в отдельном потоке

Может ли это быть вызвано тем, что классы узлов явно не реализуют runnable и поэтому не находятся в своих собственных потоках?

Любая помощь очень ценится.

Редактировать 1: я заставил классы Node реализовать Runnable и запускать их в своих собственных потоках, но он по-прежнему блокируется при вызове in.read ();

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Вы намереваетесь начать поток, вызвав метод Thread.run() вместо Thread.start(). И это делает вашу программу однопоточной, тогда операции ввода-вывода блокируют единственный поток (основной поток) в предложении try-catch, если нет поступающих данных или цикл while никогда не заканчивается.

Просто используйте Thread.start () для запуска потока, чтобы решить вашу проблему.

0 голосов
/ 31 января 2012

Проблема была решена с помощью .start () вместо .run ()

Все это сводилось к неправильному пониманию того, как создавать экземпляры потоков в Java.

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