【发布时间】:2014-05-03 22:18:51
【问题描述】:
我必须建立一个聊天程序。 有服务器类、客户端类和两个线程来编写和接收消息。 这两个线程应该在一个无限循环中运行,并一直检查是否有输入并在之后打印该输入。
但我的程序只运行一轮。所以服务器和客户端可以写一条消息,然后它停止并且不检查另一条消息。当线程从不中断时,为什么线程不会从头开始重新启动? --> 看下面的代码 我希望你知道我的问题是什么,我很难描述。
阅读新消息的线程
public class MsgWriter extends Thread {
private Socket s;
public MsgWriter(Socket s){
this.s = s;
}
public void run(){
int i = 0;
OutputStream out = null;
PrintWriter writer;
Scanner input;
while(!interrupted()){
try{
synchronized(s){
input = new Scanner (System.in);
out = s.getOutputStream();
writer = new PrintWriter(out);
String toserver = input.nextLine();
writer.write(toserver);
writer.flush();
System.out.println("me: " + toserver);
}
try {
Thread.sleep((int) (100 * Math.random()));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}catch(Exception e) {
}
}
}
}
线程检查是否有新消息并打印。
public class MsgReader extends Thread {
Socket s;
public MsgReader(Socket s){
this.s = s;
}
public void run() {
int i = 0;
while (!interrupted()) {
try{
synchronized(s){
InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String s = null;
while((s=reader.readLine()) != null){
System.out.println("d");
}
}
try {
Thread.sleep((int) (100 * 1));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}catch (Exception e){
}
}
}
}
Server 类启动一个新的服务器并等待一个客户端,然后它启动两个线程。与客户端类相同,它连接到服务器并启动线程。
【问题讨论】:
-
interrupted()方法在做什么? -
只是为了检查线程是否应该继续工作我认为。我猜 thread.interrupted() 与 thread.stop() 相同(只需在论坛中阅读它以使用 if 线程中的循环)
-
调试提示:要么使用调试器单步调试它,要么在其中穿插打印语句以找出它在哪里中断或挂起。
-
调试是一项有用的技能。如果您有更多信息,我可以尝试为您提供更多帮助,但事实上,这是我能做的最多的事情了。
-
非常感谢,我想我能找到打印方法的问题。我不得不承认,我是一个初学者,从未使用过调试器。我想我的问题不是很清楚,不是吗?我有点困惑,为什么已经有 3 个人对我的帖子投了反对票。
标签: java multithreading chat