2015-02-23 5 views
1

Я изучал Java почти 8 месяцев, и я немного запутался в прерывистых потоках.Прерывание потоков в java

У меня есть приложение JavaFX multiThreaded, которое отображает все подключенные клиенты (ip и порт и т. Д.) В виде таблицы.

Когда программа запускается, я ввожу номер порта и нажимаю кнопку запуска, которая запускает класс сервера.

У меня есть серверный класс, который реализует Runnable, а когда клиент подключается, я создаю объект класса клиента, который расширяет Thread. И сервер и клиент класс имеет в своем методе выполнения:

public void run(){ 
    while (!Thread.currentThread().isInterrupted()){ 

сервер создает клиент, как это:

new Thread(new Client(socket)).start(); 

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

На самом деле я хочу, чтобы иметь возможность изменять порт без перезапуска программы. И, конечно, я не хочу, чтобы потоки продолжали работать в фоновом режиме, если я перехожу на другой порт.

Какие у меня варианты в этом случае? Если вы пропустите какую-либо информацию, просто оставьте комментарий, и я исправлю его сразу.

+0

«Я действительно хочу, чтобы иметь возможность изменять порт без перезапуска программы. И, конечно, я не хочу, чтобы потоки продолжали работать в фоновом режиме, если я перехожу на другой порт». Итак, вы хотите разорвать какое-либо соединение с клиентом, пока оно происходит? Как грубо ... Я думаю, что намного лучше, если у вас есть рабочие потоки, проверяющие какую-то переменную и позволяющие им отключиться (используя протокол приложения). –

+0

@MaartenBodewes haha ​​Я хочу, чтобы это сделать, допустим, если я набираю неправильный номер порта или anythying. – Johan

+0

@MaartenBodewes Хорошо, вы имеете в виду что-то вроде volatile boolean? – Johan

ответ

2

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

Thread t = new Thread(new Runnable(){ 

    new Thread(new Runnable(){ 
     for(int i = 0; i < 1000; i++) System.out.println(i); 
    }).start; 

}).start(); 

t.interrupt(); 

Резиновая нить должна продолжать работать с программой, так как она находится в другом потоке, чем родительский. Основной задачей родительского потока является запуск дочернего потока, и если он умирает, ребенок продолжает жить.

+0

Спасибо за ответ. Вот что я подумал. Я просто воссоздаю serverocket или, может быть, если я буду хранить все клиентские объекты в связанном списке, я могу просто пропустить их и закрыть theam, не так ли? – Johan

+0

@Johan Это должно работать, вы можете использовать 'CopyOnWriteArrayList', который позволяет вам делать что-то вроде объектов for (Object o: objects).remove (o); 'Это может быть полезно в некоторых случаях, но в основном для отладки. – phase

+0

Спасибо! Раньше я использовал clientobject = null, но останавливает ли этот поток или только делает объект точкой равным нулю? Добавьте то, что вы написали как ответ, и я соглашусь :) – Johan

Смежные вопросы