Java: Почему метод не вызывается, когда внутри потока? - PullRequest
0 голосов
/ 05 июня 2011

у меня есть метод:

public String getPresentValue(ObjectIdentifier oid) throws Exception {
    ReadPropertyRequest rpr = new ReadPropertyRequest(oid, PropertyIdentifier.presentValue);
    ReadPropertyAck rpa = (ReadPropertyAck) localDevice.send(isa, null, 1476, Segmentation.segmentedBoth, rpr);

    return rpa.getValue().toString();
}

Это прекрасно работает, когда я вызываю его вне потока, но когда я пытаюсь вызвать его внутри потока, ничего не происходит.

Почему это происходит?

Обновление:

public void active(Supervisory supervisory) {

       //.. my code above is just simple maths

        System.out.println("presentValue in the thread" + getPresentValue(oi));


        ScanAO scanAO = new ScanAO();

        Thread threadAO = new Thread(scanAO);
        threadAO.start();

    } catch (IOException ioe) {
        ioe.printStackTrace();

    } catch (Exception ex) {
        ex.printStackTrace();
    }

}


    class ScanAO extends Thread {

        public void run() {
            try {

                for (ObjectIdentifier oi : oisAO) {
                    System.out.println("presentValue in the thread" + getPresentValue(oi));
                }

            } catch (Exception e) {
            }

        }
    }

С уважением, Вальтер Энрике.

Ответы [ 2 ]

0 голосов
/ 06 июня 2011

Просто чтобы прояснить: когда вы вызываете код с помощью .start() (с многопоточностью), вы получаете исключение, а когда вы меняете threadAO.start() на threadAO.run() (без многопоточности), он работает правильно?

Возможно, oisAO не синхронизируется между потоками: исходный поток изменяет состояние oisAO (закрывает сокет), прежде чем новый поток, созданный .start(), сможет выполнить свою работу.Чтобы определить, является ли это проблемой, вы можете попробовать добавить threadAO.join() (приостановить текущий поток, пока новый поток не будет завершен) сразу после threadAO.start().

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

0 голосов
/ 05 июня 2011

Может ли быть проблема с "oisAO"? Если ваш getPresentValue () работает вне потока, он, вероятно, должен работать внутри нового потока. Это может быть то, что вы передаете в функцию.

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