线程未在 Java 后恢复?

Thread not resuming in Java?

我正在使用线程将图像绘制到 JFrame 上。
我添加了一个 keyListener 来监听键 P,当它被按下时,图像的绘制停止,当我再次按下 P 时,绘图应该恢复。

我尝试使用等待/通知和同步块来实现这个。
但是只有暂停有效,简历永远无效。
奇怪...

public static void main(String[] args)
{       
    static JFrame window1 = new JFrame();
    static boolean isPaused=false;
    Runnable r = new Runnable()
    {
         public void run()
         {
             while(true)
             {
                 window1.paintImage();//fn to redraw an image
             }
         }
    };

    final Thread t = new Thread(r);

    window1.addKeyListener(new KeyListener()
    {
        public void keyPressed(KeyEvent e)
        {
            if(e.getKeyCode() == KeyEvent.VK_P)
            {
                if(isPaused==false)
                {
                    synchronized(t)
                    {
                        try
                        {
                            t.wait();
                        } catch (InterruptedException e1)
                        {
                            e1.printStackTrace();
                        }
                    }
                    isPaused=true;
                } else
                {
                    t.notifyAll();
                    isPaused=false;
                }
            }
        }
        public void keyReleased(KeyEvent arg0){}
        public void keyTyped(KeyEvent arg0){}

    });


    t.start();
  }
}

您应该完成 Object.waitJavadoct.wait()执行时,current线程是"paused",不是t。 更确切地说,您正在暂停负责处理输入的 SWING 线程,而不是您创建的用于重绘图像的 Thread tt.wait() 使 SWING 线程等待,直到它收到一个 notify(),它永远不会到来,因为 t.notifyAll() 只能由同一个 SWING 线程到达(所以就像你要睡觉一样你在等着自己把你叫醒……祝你好运)。

这是修复它的一种解决方案(虽然不是最好的,因为它不关心同步):

  final  boolean [] pause = new boolean []{false};
  Runnable r = new Runnable()
{
     public void run()
     {
         while(true)
         {
             if(!pause[0])
             window1.paintImage();//fn to redraw an image
         }
     }
};

...

public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_P)
        {
            if(!pause[0])
            {
                pause[0] = true;
            } else
            {
                pause[0] = false;
            }
        }
    }