Java: Как остановить stream?

Есть ли способ остановить другой stream от OUTSIDE из streamа? Например, если я запустил stream для запуска этого streamа и заставил этот stream остановиться? Остановит ли он другую нить?

Есть ли способ остановить stream изнутри без цикла? Например, если вы в идеале загружаете, вы бы хотели использовать цикл, и если я использую цикл, я не буду останавливать его до тех пор, пока он не достигнет конца цикла.

Вы можете создать логическое поле и проверить его внутри run:

public class Task implements Runnable { private volatile boolean isRunning = true; public void run() { while (isRunning) { //do work } } public void kill() { isRunning = false; } } 

Чтобы остановить это, просто позвоните

 task.kill(); 

Это должно сработать.

Мы не останавливаем или не убиваем нить, а делаем Thread.currentThread().isInterrupted().

 public class Task1 implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { ................ ................ ................ ................ } } } 

в основном мы сделаем вот так:

 Thread t1 = new Thread(new Task1()); t1.start(); t1.interrupt(); 

Один из возможных способов – сделать что-то вроде этого:

 public class MyThread extends Thread { @Override public void run() { while (!this.isInterrupted()) { // } } } 

И когда вы хотите остановить свой stream, просто вызовите метод interrupt ():

 myThread.interrupt(); 

Конечно, это не остановит stream немедленно, но в следующей итерации цикла выше. В случае загрузки вам нужно написать неблокирующий код. Это означает, что вы попытаетесь прочитать новые данные из сокета только в течение ограниченного времени. Если данных нет, оно будет продолжено. Это можно сделать с помощью этого метода из classа Socket:

 mySocket.setSoTimeout(50); 

В этом случае тайм-аут устанавливается на 50 мс. По прошествии этого времени данные не считываются, и он генерирует исключение SocketTimeoutException. Таким образом, вы можете написать итеративную и неблокирующую нить, которую можно убить, используя приведенную выше конструкцию.

Невозможно убить stream каким-либо другим способом, и вы должны реализовать такое поведение самостоятельно. В прошлом Thread имел некоторый метод (не уверен, что kill () или stop ()) для этого, но теперь он устарел. Мой опыт в том, что некоторые реализации JVM даже не содержат этот метод в настоящее время.

Рекомендуемым способом будет создание этого в streamе. Таким образом, вы не можете (или, скорее, не должны) убить stream извне.

Регулярно проверяйте stream, если это необходимо для остановки. (Вместо того, чтобы блокировать сокет до тех пор, пока не будут данные. Используйте тайм-аут и каждый раз в то время проверяйте, хочет ли пользователь остановиться)

Рекомендация JavaSun заключается в использовании общей переменной в качестве флага, который просит остановить фоновый stream. Затем эту переменную можно установить другим объектом, запрашивающим завершение streamа.

Вы можете таким образом убить другой процесс, а текущий – потом.

  • Накладные расходы на создание streamов Java
  • Ссылка на multithreading?
  • Обходной путь для ограничения пропускной способности WaitHandle.WaitAll 64?
  • Можете ли вы получить доступ к элементам пользовательского интерфейса из другого streamа? (не задано)
  • Когда stream Java достигает состояния «Die»
  • Показывать индикатор выполнения при выполнении некоторой работы на C #?
  • ConfigureAwait подталкивает продолжение в stream пула
  • «Реализует Runnable» против «extends Thread»
  • Обработчики, MessageQueue, Looper, все ли они работают в streamе пользовательского интерфейса?
  • В чем разница между QueueUserWorkItem () и BeginInvoke (), для выполнения асинхронной активности без необходимости возврата типов
  • Как эффективно отображать OpenCV-видео в Qt?
  • Давайте будем гением компьютера.