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

时间:2014-10-26 07:24:05

标签: java multithreading

我遇到了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); 
    }

}

1 个答案:

答案 0 :(得分:1)

如果计算时间不长,请不要使用额外的线程。

如果你需要这个额外的线程,请确保它不会永远运行(没有时间(true)而没有在某些时候返回)

在创建新的

之前,您始终可以中断正在运行的线程
if (t != null && t.isAlive()) {
  t.interrupt();
}

并在线程中断时检查while(true)循环

if (t.isInterrupted()) {
  System.out.println("Thread ended");
  return;
}

希望这会有所帮助