我正在实施聊天程序。每当用户点击Player.java中的“START”时,它将终止前一个Chatter线程并构建一个新的线程来启动。 Chatter线程具有用于聊天的GUI。无法中断线程
我通过interrupt()方法终止Chatter线程。我认为它会在Chatter线程中设置标志,以便通过检查isInterrupted()来终止它,但它总是为false。但它应该当我Player.java
这里调用中断()是真的是我的代码: 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);
}
}
'msgSound.play()'做了什么?请考虑花时间将您的代码缩减为[最小完整示例](http://stackoverflow.com/help/mcve)。否则,我们花时间猜测。 – Radiodef 2015-04-05 18:12:19
感谢您的反馈。我刚刚删除它。 – Fan 2015-04-05 18:15:31
好的,删除它并没有什么帮助。我得到的一点是你没有发布所有相关的代码。有些操作可以清除中断标志,或者您正在捕获'InterruptedException'。目前这个问题是无法回答的,因为代码不会重现问题。例如见[Ideone示例](http://ideone.com/ZoY6ph),它显示'interrupt' /'isInterrupted'单独正确工作。 – Radiodef 2015-04-05 18:22:35