Как сделать другой stream сна в Java

У меня есть class, который расширяет Thread. Этот stream при запуске тратит большую часть времени на hibernate, он выполняет проверку, если истина выполняет простое действие, а затем спать на 1/2 секунды и повторять.

Класс также имеет открытый метод, который вызывается другими streamами. Если это называется, я хочу, чтобы stream спал дольше, если он уже спит или просто спит немедленно, если это не так. Я попытался получить this.sleep, но кажется, что это все еще спит текущий stream, и он жалуется, что метод сна является статическим и должен получить доступ к статически.

Эта программа показывает мою проблему, когда вызывается CauseSleep, я хочу, чтобы она прекратила печатать цифры до тех пор, пока этот сон не закончится.

public class Sleeper { public static void main(String[] args) { new Sleeper(); } public Sleeper() { System.out.println("Creating T"); T t = new T(); System.out.println("Causing sleep"); t.CauseSleep(); System.out.println("Sleep caused"); } public class T extends Thread { public T() { this.start(); } public void run() { for (int i = 0; i < 30; i++) { System.out.println("T Thread: " + i); try { Thread.sleep(100); } catch (InterruptedException e) { } } } public void CauseSleep() { try { this.sleep(2000); } catch (InterruptedException e) { } } } } 

Выход, который я получаю,

 Creating T Causing sleep T Thread: 0 T Thread: 1 T Thread: 2 T Thread: 3 T Thread: 4 T Thread: 5 T Thread: 6 T Thread: 7 T Thread: 8 T Thread: 9 T Thread: 10 T Thread: 11 T Thread: 12 T Thread: 13 T Thread: 14 T Thread: 15 T Thread: 16 T Thread: 17 T Thread: 18 Sleep caused T Thread: 19 T Thread: 20 T Thread: 21 T Thread: 22 T Thread: 23 T Thread: 24 T Thread: 25 T Thread: 26 T Thread: 27 T Thread: 28 T Thread: 29 

3 Solutions collect form web for “Как сделать другой stream сна в Java”

Вы не можете заставить другой stream спать. (Вы можете использовать устаревший метод suspend() , но не делайте этого). Этот вызов:

 this.sleep(200); 

фактически сделает текущий исполняемый stream sleep – не Thread ссылается «this». sleep – это статический метод – хорошие IDE выдадут предупреждение по этой строке.

У вас должен быть только флаг, говорящий «спать, пожалуйста», а затем попросите спящий stream проверить этот флаг перед выполнением какой-либо работы.

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

Добавьте это в свой stream:

 public AtomicBoolean waitLonger = new AtomicBoolean (); public Object lock = new Object (); 

В run() :

 synchronized (lock) { if (waitLonger.get ()) { lock.wait (); } } 

В другом streamе:

 synchronized (lock) { try { sleeper.waitLonger.set(true); ... lock.notify(); sleeper.waitLonger.set(false); } 

Таким образом, вы можете заставить спящего ждать, пока другая работа не завершится.

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

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

Другим решением было бы в активности streamа normal также опросить переменную, как в первом случае, и спать, если она установлена. Это не вызовет немедленного сна , но это может быть довольно быстро, и прерывание будет в специальных точках вашего кода, где вы знаете, что можете остановиться, не нарушая ничего …

  • Является ли ConcurrentHashMap полностью безопасным?
  • Как работает stream отправки событий?
  • Гарантии гарантий безопасности
  • java скачать несколько файлов с помощью streamов
  • Что такое stream демона в Java?
  • c #, работающий с Entity Framework на многопоточном сервере
  • Как CountDownLatch используется в многопоточности Java?
  • Вы когда-нибудь использовали ключевое слово volatile в Java?
  • Пауза / остановка и запуск / возобновление Java TimerTask непрерывно?
  • Создайте несколько streamов для работы, затем подождите, пока все закончится
  • Несколько клиентов одновременно получают доступ к серверу
  • Давайте будем гением компьютера.