Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дочерний поток застывает, если застыл родительский 
V
    Опции темы
AzeriSoul
Дата 25.4.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.4.2010
Где: Deutschland

Репутация: нет
Всего: нет



Здравствуйте.
Код

private class VncSession implements PacketReceiver
    {
        private String        sessId;
        private int           portNum;
        private ProcessRunner vncProcess;
        private JpcapCaptor   srvDevice;


        public void receivePacket(Packet packet)
        {
            TCPPacket p = (TCPPacket) packet;

            if (p.fin && (p.src_port == portNum || p.dst_port == portNum))
                srvDevice.breakLoop();
        }

        private void startSession(ArrayList<String> cmds)
        {
            vncProcess = new ProcessRunner();
            vncProcess.setCommand(cmds);

            Thread vncThread = new Thread(vncProcess);
            vncThread.start();
        }

        private void startListening(int port)
        {
            Thread listenerThread = new Thread(new TCPListener(port));
            listenerThread.start();

            try
            {
                while(true);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        private String generateSessId()
        {
            Random randomizer = new Random();

            int randLength = 30;
            String res = "";
            for(int i = 0; i < randLength; ++i)
            {
                int randVal = randomizer.nextInt(10);
                res += Integer.toString(randVal);
            }

            res += Integer.toString(portNum);

            return res;
        }

        public String getSessId()
        {
            return sessId;
        }

        public int getPortNum()
        {
            return portNum;
        }

        public VncSession(int vncPort, ArrayList<String> cmds)
        {
            portNum = vncPort;
            sessId = generateSessId();

            startSession(cmds);
            log.info("session #" + sessId + " on port #" + portNum + " started");

            startListening(portNum);
            log.info("port #" + portNum + " being listened");

            killSession();
         }

        public void killSession()
        {
            vncProcess.setTimeout(0);
            log.info("session #" + sessId + " on port #" + portNum + " killed");
        }
    };




Итак. Эта функция вызывается из конструктора, чтоб создать сессию(не важно что это). Создается обьект vncProcess который реализует интерфейс Runnable. Далее создается поток vncThread и запускается. Т.е. отныне должно быть два параллельно выполняющихся кода. Это текущий код и код который выполняется в методе run() обьекта vncProcess.
Код

private void startSession(ArrayList<String> cmds)
{
    vncProcess = new ProcessRunner();
    vncProcess.setCommand(cmds);

    Thread vncThread = new Thread(vncProcess);
    vncThread.start();
}


Далее по коду выполняется эта функция. Здесь я намеренно поставил бесконечный цикл, для того чтоб преостановить работу первого - родительского потока. Однако, несмотря на это код дочернего потока созданного выше также "застывает". Будто у меня не два параллельных потока, а один. Если я ставлю вместо while(true); скажем listenerThread.join(1000), то работа ранее созданного vncThread начинается именно через секунду. Он как-то привязан к текущему...
Код

private void startListening(int port)
{
    Thread listenerThread = new Thread(new TCPListener(port));
    listenerThread.start();

    try
    {
        while(true);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}


Отчего получается так что родительский и дочерний потоки привязаны друг к другу и не параллельны и что сделать чтоб они стали параллельны? Благодарю.  smile 

Это сообщение отредактировал(а) AzeriSoul - 25.4.2010, 19:46
PM MAIL   Вверх
AzeriSoul
Дата 25.4.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.4.2010
Где: Deutschland

Репутация: нет
Всего: нет



Не буду морочить голову дальше, нашел ошибку. В коде все Ок. Ошибка была вне. Там где создается сам обьект VncSession. Конструктор если вошел в бесконечный цикл или присоеденился к другому потоку при помощи join, то немедленного возврата из конструктора ес-нно не будет, а это в  моем случае нарушает работу программы. Вобщем по своей глупости. Тема закрыта, извиняюсь за потраченное время.

Это сообщение отредактировал(а) AzeriSoul - 25.4.2010, 23:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0385 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.