Здравствуйте.
| Код | 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(); } }
|
Отчего получается так что родительский и дочерний потоки привязаны друг к другу и не параллельны и что сделать чтоб они стали параллельны? Благодарю. |