Хобрук: Ваш путь к мастерству в программировании

Java: поток не будет ждать

Я пытался заставить этот поток ждать, но он не ждет, не генерирует исключение и не делает ничего... (Я создал новый поток для запуска потока, потому что в противном случае мой графический интерфейс зависает из-за вызова метода ожидания в edt)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Sandbox extends JFrame {

boolean paused = false;
Thread thread = new Thread() {
    public void run() {
        while(true) {
            System.out.println("running...");
        }
    }
};

private JButton button;
public Sandbox() throws Exception {
    thread.start();
    setSize(300, 150);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(3);
    add(button = new JButton("Pause"));
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        new Thread() {
            public void run() {
                synchronized(thread) {  
                    try {
                        if(button.getText().equals("Pause")) {
                            thread.wait();
                            button.setText("Resume");

                        } else if(button.getText().equals("Resume")) {
                            thread.notify();
                            button.setText("Pause");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }});
    setVisible(true);
}

public static void main(String[] args) throws Exception {
    new Sandbox();
}
}

  • Вы не должны вызывать wait для Thread объектов. Используйте join, чтобы дождаться его завершения. wait/notify используются для поведения условной переменной. 10.11.2013
  • Я не думаю, что поток когда-либо умрет... Его цикл while продолжается бесконечно 10.11.2013
  • Я думаю, вы не понимаете, что делает метод wait. Что вы ожидаете, когда вы позвоните thread.wait()? 10.11.2013
  • Я ожидаю, что поток перестанет распечатывать работу... и дождусь, пока я не вызову notify(); 10.11.2013
  • wait может остановить только поток, который вызывает этот метод, а не любой другой. Вероятно, вам нужно прерывание потока. 10.11.2013
  • Я пытался использовать ожидание внутри класса, который мне нужно было ждать, это тоже не работает 10.11.2013

Ответы:


1

Если вы сравниваете строки, вам нужно использовать equals(), а не ==

if(button.getText().equals("Pause")) {
    thread.wait();
    button.setText("Resume");

} else if(button.getText().equals("Resume")) {
    thread.notify();
    button.setText("Pause");
}

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

09.11.2013
  • Да, я понимаю, это был просто грубый код, чтобы добраться до проблемы, с которой я имел дело в течение довольно долгого времени. Ну что еще я могу использовать? 10.11.2013
  • Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..