如何在Java中打开新线程之前关闭线程?
我对Java的多线程特性有问题,希望有人能帮助我 我的问题是: 在JFrame如何在Java中打开新线程之前关闭线程?,java,multithreading,Java,Multithreading,我对Java的多线程特性有问题,希望有人能帮助我 我的问题是: 在JFrameExampleFrame中的JPanelExamplePanel中,我添加了一个ComponentListener,它调用startPaint()方法。此方法应在新线程中工作。我的问题是,通过调整窗口大小,“旧”线程不会关闭,同时会添加新线程 那么,当我调整JPanel的大小时,有没有一种方法可以调整JPanel的大小,同时关闭“旧”线程,这样线程的数量就不会增加 我尝试过使用布尔exiter-变量的方法,但它似乎不起
ExampleFrame
中的JPanelExamplePanel
中,我添加了一个ComponentListener,它调用startPaint()方法。此方法应在新线程中工作。我的问题是,通过调整窗口大小,“旧”线程不会关闭,同时会添加新线程
那么,当我调整JPanel的大小时,有没有一种方法可以调整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);
}
}
如果计算时间不长,不要使用额外的线程 如果您需要这个额外的线程,请确保它不会永远运行(no-while(true),而不会在某个点返回) 在创建新线程之前,您可以随时中断正在运行的线程
if (t != null && t.isAlive()) {
t.interrupt();
}
如果线程被中断,则检查while(true)循环
if (t.isInterrupted()) {
System.out.println("Thread ended");
return;
}
希望这有帮助请看。可能需要更多帮助吗?它会为您提供所需的精确代码。你想让我复制粘贴到这里吗?文本上说,如果我想停止线程,我应该写blinker=null,这意味着在我的情况下t=null?这听起来像是糟糕的设计。不要到处创建线程,而是使用例如a,然后每次向其提交一个
Runnable
任务-这就是执行者的职责。但是<代码>起始点()?您不打算直接从单独的线程在Swing组件上绘图,是吗?每个线程都需要一些内存,启动它们需要一点时间。所以,如果你创建了很多线程,这通常不是一个好主意。