线程未在 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.wait
的 Javadoc。
t.wait()
执行时,current线程是"paused",不是t
。
更确切地说,您正在暂停负责处理输入的 SWING 线程,而不是您创建的用于重绘图像的 Thread t
。
t.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;
}
}
}
我正在使用线程将图像绘制到 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.wait
的 Javadoc。
t.wait()
执行时,current线程是"paused",不是t
。
更确切地说,您正在暂停负责处理输入的 SWING 线程,而不是您创建的用于重绘图像的 Thread t
。
t.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;
}
}
}