Вы можете использовать прерывания для отправки в поток и обработки их для повторной попытки. Вот пример, который запустит поток, который не будет завершен до тех пор, пока не будет установлено логическое значение. Однако я прерываю поток из основного потока, чтобы начать его работу.
public class Runner implements Runnable {
private boolean done;
@Override
public void run() {
while (!done) {
try {
doSomeLongRunningStuff();
} catch (InterruptedException e) {
System.out.println("Interrupted..");
}
}
}
private void doSomeLongRunningStuff() throws InterruptedException {
System.out.println("Starting ... ");
Thread.sleep(300);
System.out.println("Still going ... ");
Thread.sleep(300);
done = true;
System.out.println("Done");
}
public static void main(final String[] args) throws InterruptedException {
final Thread t = new Thread(new Runner());
t.start();
Thread.sleep(500);
t.interrupt();
Thread.sleep(500);
t.interrupt();
}
}
Можете ли вы это сделать так или иначе, зависит от того, что вы вызываете. Ваша инфраструктура, использующая TCP-соединение, может или не поддерживает прерывание.
Пожалуйста, добавьте код. Мы говорим о TCP или UDP? – Fildor
Зачем нужно остановить поток только потому, что что-то произошло в сетевом сообщении? – Kayaman
@ Кайман прав. Вам не нужно перезапускать поток, просто обработайте его правильно. Ожидается Packetloss. В случае TCP он будет обработан для вас стекю TCP; вам просто нужно дать ему некоторое время. – vhu