Проблема с многопоточностью в java

#java #multithreading #swing #thread-sleep

#java #многопоточность #swing #поток-сон

Вопрос:

Я столкнулся с проблемой в потоке.Вот мой код

 private void CustomBrightActionPerformed(java.awt.event.ActionEvent evt) {
    creed = new Thread() {
        public void run() {
            final JFrame jfmae = new JFrame("Set BrightNess");
            JLabel jla = new JLabel("!@#$");

            jfmae.add(jla, BorderLayout.CENTER);
            jfmae.setSize(180, 180);

            jfmae.addMouseListener(new Mymos());
            jfmae.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent windowEvent) {
                    jfmae.dispose();
                }
            });
            jfmae.setVisible(true);
        }
    };
    creed.start();
}

class Mymos extends MouseAdapter {
    public void mousePressed(java.awt.event.MouseEvent evt) {
        try {
            creed.sleep(3000);
        } catch (InterruptedException e) {

        }
        Bigh2MousePressed(evt);
    }

    private void Bigh2MousePressed(java.awt.event.MouseEvent evt) {
        System.out.println("dsds");
    }
}




   
  

CustomBrightActionPerformed

это метод другого класса, который имеет дело с событием действия и Mymos является внутренним классом.Проблема в том, что я сплю creed Thread , но мой основной поток также спит в течение 3 секунд.Почему?

Ответ №1:

вы вызываете sleep() основной поток,

sleep() является static ли метод, который вы просто используете для вызова экземпляра его потока (creed), который не рекомендуется, он спит Thread , в котором вызывается этот метод

если вы хотите приостановить поток creed, вам нужно выполнить Thread.sleep() из его run() метода

Комментарии:

1. Один вопрос. если я выполню некоторые операции в Bigh2MousePressed, и если возникнет некоторая задержка, будет ли это также приостанавливать выполнение основного потока?

2. если он вызывается в том же потоке, то да, если это асинхронный вызов в новом потоке, то он сразу же вернется в основной поток и выполнит операцию в другом потоке

3. Я попробовал Thread.sleep() из метода запуска creed, но все равно он приостанавливает основной поток

4. вы удалили call to creed.sleep(3000); ?

5. черт, я этого не сделал. Извините за это.