我遇到了Java的多线程功能问题,所以希望有人可以帮助我....
这是我的问题:
在位于JFrame ExamplePanel
的JPanel ExampleFrame
中,我添加了一个ComponentListener,它调用startPaint() - Method。此方法应在新线程中工作。我的问题是通过调整窗口大小"前者"线程没有关闭,同时添加了新的线程......
那么有没有办法调整JPanel的大小并同时关闭" old"线程,这样当我调整JPanel的大小时,线程的数量没有增长?
我尝试过使用布尔exiter
- 变量的东西,但它似乎没有用......
这是代码:
package example;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Example2 {
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new ExampleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class ExampleFrame extends JFrame {
private static final long serialVersionUID = 1L;
ExamplePanel examplePanel = new ExamplePanel();
private Thread t=null;
private class ExamplePanel extends JPanel implements ComponentListener {
private static final long serialVersionUID = 1L;
@Override
public void componentHidden(ComponentEvent e) {
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
startPaint();
}
@Override
public void componentShown(ComponentEvent e) {
}
private void startPaint() {
t=new Thread(new Runnable() {
@Override
public void run() {
//System.out.println(Thread.currentThread().getName());
while (true) {
//System.out.println(Thread.activeCount());
}
}
});
t.start();
}
}
public ExampleFrame() {
examplePanel.addComponentListener((ComponentListener) examplePanel);
getContentPane().add(examplePanel);
}
}
答案 0 :(得分:1)
如果计算时间不长,请不要使用额外的线程。
如果你需要这个额外的线程,请确保它不会永远运行(没有时间(true)而没有在某些时候返回)
在创建新的
之前,您始终可以中断正在运行的线程if (t != null && t.isAlive()) {
t.interrupt();
}
并在线程中断时检查while(true)循环
if (t.isInterrupted()) {
System.out.println("Thread ended");
return;
}
希望这会有所帮助