생활
자바 쓰레드(스레드) 질문 드립니다.
쓰레드 질문 좀 드리겠습니다.
버튼을 누를때마다 getState 메소드를 사용해서 쓰레드의 상태를 출력하도록 했습니다.
근데 쓰레드의 상태가 TERMINATED 라고 출력된 이후에도
버튼을 누르면 에러없이 TERMINATED 라고 계속 출력해줍니다.
쓰레드가 종료되면 쓰레드가 사라져서 널포인터익셉션이 발생할 줄 알았는데...
이유가 궁금합니다.
package study; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; public class Jf extends JFrame { private JPanel contentPane; JLabel lblNewLabel; int n; StopFlagThread t1; /** * Launch the application. */ public static void main(String[] args) { Jf frame = new Jf(); frame.setVisible(true); } /** * Create the frame. */ public Jf() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 260, 167); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); JButton btnNewButton_1 = new JButton("stop"); contentPane.add(btnNewButton_1, BorderLayout.EAST); lblNewLabel = new JLabel("New label"); lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); contentPane.add(lblNewLabel, BorderLayout.CENTER); JButton btnNewButton = new JButton("start"); contentPane.add(btnNewButton, BorderLayout.WEST); t1 = new StopFlagThread(); btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { n = 1; t1.start(); System.out.println(t1.getState()); } }); btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { t1.setStop(); System.out.println(t1.getState()); } }); } class StopFlagThread extends Thread { private boolean isStop; @Override public void run() { while (!isStop) { lblNewLabel.setText(n + ""); n++; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block return; } } } public void setStop() { this.isStop = true; } } }55글자 더 채워주세요.
2개의 답변이 있어요!
안녕하세요.
답변자로 활동중인 굴뚝새 입니다.
질문자께서 자바 쓰레드에 관련하여 질문을 주셨는데요.
작성해주신 소스를 보니
이미 돌아가고 있는 쓰레드에 isStop에 true를 넣어 정지시키시려 한거같은데요
이미 돌아가고있는 쓰레드에 영향을 주지 못합니다
쓰레드를 종료시키시려면 stop() 으로 종료시키실수 있습니다
글로 설명하려니 한계가 있는데요
필요한 답변이 되셨길 바랍니다
생성자에서 t1에 Thread 를 상속한 객체를 생성해 주고 나서 t1 변수에 null 을 넣어주거나..
t1 변수를 참조하는 부분이 없어서 가비지콜렉션이 수행되지 않는 이상...객체가 null 이 되서 널포인터 익셉션이 날 일은 없어 보이네요.
쓰레드의 상태는 한번 TERMINATED 상태가 되면..계속 이 상태일 거구요.
t1 = new StopFlagThread();