无法中断线程

时间:2015-04-05 18:04:21

标签: java multithreading

我正在实施聊天程序。每当用户点击" START"在Player.java中,它将终止先前的Chatter线程并构建一个新的线程来启动。 Chatter线程具有用于聊天的GUI。

我通过interrupt()方法终止Chatter线程。我认为它将在Chatter线程中设置标志,以便通过检查isInterrupted()来终止它,但它始终为false。但是当我在Player.java中调用interrupt()

时,它应该是真的

这是我的代码: Player.java

    public class Player implements GameConstants{
        /**
         * This listener is used when the user clicks QUIT in the GUI.
         */
        private class ControlListener implements ActionListener{

            /**
             * This method sends QUIT to the server when the listener is triggered.
             * @param e ActionEvent
             */
            @Override
            public void actionPerformed(ActionEvent e){    
                String cmd = ((JButton)(e.getSource())).getText();

                if ("START".equals(cmd)) {

                    //I interrupt the thread using this
                    if (chatThread !=null) {
                        System.err.println("before interruped");
                        chatThread.interrupt();
                    }

                    chatThread = new Chatter(ip,senderName);
                    chatThread.start();
                }


            }
        }
    }

这是Chatter.java

    public class Chatter extends Thread implements GameConstants{
        private JTextArea log;
        private String senderName;
        private DataInputStream fromServer;
        private DataOutputStream toServer;
        private JTextField inputField;
        private SoundPlayer msgSound;
        private Socket socket;



        private class SendListener implements ActionListener{
            @Override
            public void actionPerformed(ActionEvent e){
                String msg = inputField.getText();
                inputField.setText("");
                try {
                    toServer.writeUTF(""+(new Date())+ "\n" + senderName + ": "+msg);
                    toServer.flush();
                } catch(IOException ex) {
                    System.err.println(ex.getMessage());
                }
            }

        }


        public Chatter(String ip, String senderName){
            this.senderName = senderName;

            buildGUI();
            try{
                socket = new Socket(ip,CHAT_PORT);
                fromServer = new DataInputStream(socket.getInputStream());
                toServer =  new DataOutputStream(socket.getOutputStream());
            }catch(IOException e){
                System.out.println(e.getMessage());
            }
        }

        @Override
        public void run(){
            try {
                while(!isInterrupted()){
                    String msg = fromServer.readUTF();
                    report(msg);
                }

            } catch(IOException e) {
                System.err.println(e.getMessage());
            }finally{
                try {
                    socket.close();
                } catch(Exception e) {
                }

            }        

        }


        private void buildGUI(){
            JFrame frame = new JFrame();
            frame.setSize(WIDTH,HEIGHT);
            frame.setTitle("Chat Room - " + senderName);
            frame.setResizable(false);
            // .... just building the GUI

            frame.add(parentPanel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }

    }

1 个答案:

答案 0 :(得分:0)

当你中断一个线程时,如果它正在等待某些IO操作或类似操作,它可能会抛出InterruptedException。抛出异常后,它的中断标志将被清除,并且将再次为假。