Дочерний поток застывает, если застыл родительский

 
0
 
Java
ava
AzeriSoul | 25.04.2010, 20:42
Здравствуйте.

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
Ответы (1)
ava
AzeriSoul | 25.04.2010, 23:21 #
Не буду морочить голову дальше, нашел ошибку. В коде все Ок. Ошибка была вне. Там где создается сам обьект VncSession. Конструктор если вошел в бесконечный цикл или присоеденился к другому потоку при помощи join, то немедленного возврата из конструктора ес-нно не будет, а это в моем случае нарушает работу программы. Вобщем по своей глупости. Тема закрыта, извиняюсь за потраченное время.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить