如何在Java中打开新线程之前关闭线程?

如何在Java中打开新线程之前关闭线程?,java,multithreading,Java,Multithreading,我对Java的多线程特性有问题,希望有人能帮助我 我的问题是: 在JFrameExampleFrame中的JPanelExamplePanel中,我添加了一个ComponentListener,它调用startPaint()方法。此方法应在新线程中工作。我的问题是,通过调整窗口大小,“旧”线程不会关闭,同时会添加新线程 那么,当我调整JPanel的大小时,有没有一种方法可以调整JPanel的大小,同时关闭“旧”线程,这样线程的数量就不会增加 我尝试过使用布尔exiter-变量的方法,但它似乎不起

我对Java的多线程特性有问题,希望有人能帮助我

我的问题是:

在JFrame
ExampleFrame
中的JPanel
ExamplePanel
中,我添加了一个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组件上绘图,是吗?每个线程都需要一些内存,启动它们需要一点时间。所以,如果你创建了很多线程,这通常不是一个好主意。