Java中的Println和线程
我正在用Java编程一个多线程的服务器,很早我就遇到了一个非常奇怪的问题 这是我的密码:Java中的Println和线程,java,multithreading,Java,Multithreading,我正在用Java编程一个多线程的服务器,很早我就遇到了一个非常奇怪的问题 这是我的密码: package net.twh; import java.net.DatagramSocket; import java.util.Scanner; public class Server { public static EntryThread entry; public static ServerPhases phase; public static DatagramSock
package net.twh;
import java.net.DatagramSocket;
import java.util.Scanner;
public class Server {
public static EntryThread entry;
public static ServerPhases phase;
public static DatagramSocket serverSocket;
public static boolean stopProgram;
public static Scanner keyboard;
public static void main(String[] args) {
Configuration.port = 17550;
keyboard = new Scanner(System.in);
entry = new EntryThread();
entry.run();
while (!stopProgram)
{
String line = "";
System.out.printf("> ");
line = keyboard.next();
System.out.printf(line);
if (line == "close")
{
entry.stop = true;
stopProgram = true;
}
}
}
}
这是我的帖子:
package net.twh;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class EntryThread extends Thread {
public boolean stop;
public EntryThread() {
stop = false;
}
public void run() {
Runtime.getRuntime().addShutdownHook(new Thread(){public void run(){ // AUTOCLOSE NE PAS SUPPRIMER !!!!!
try {
Server.serverSocket.close();
System.out.println("The server is shut down!");
} catch (Exception e) { /* failed */ }
}});
try {
Server.serverSocket = new DatagramSocket(Configuration.port);
byte[] receiveData = new byte[8];
System.out.printf("Listening on udp:%s:%d%n",
InetAddress.getLocalHost().getHostAddress(), Configuration.port);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
while(!stop) {
Server.serverSocket.receive(receivePacket);
byte[] data = receivePacket.getData();
System.out.println("RECEIVED: " + new String(data));
InetAddress IPAddress = receivePacket.getAddress();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接收数据包时,消息会起作用,扫描仪也会起作用,但我输入的“>”和字符串不会显示。您没有启动线程,您只是按顺序执行线程的
run()
方法。启动线程的正确方法是调用entry.start()
,而不是entry.run()
另见:
System.out的流是一个
打印流,它只在换行符上刷新输出(请参阅)。但您可以显式调用flush()
或打印换行符(在您的示例中,这看起来更好):
因为我不明白为什么您使用没有任何格式的printf()
,我用适当的方法替换了它
顺便说一句:是的,您的代码不同时执行任何操作,但这不是问题所在。现在您调用了run方法而不是start(),线程中的run()方法是start创建新线程,而run不创建任何线程,只是像普通方法调用一样在当前线程中执行
entry = new EntryThread();
entry.run();
使用
我相信这可能是您使用System.out.printf而不是println的原因。如果您没有启动线程,那么您只是按顺序执行线程的run()
方法。启动线程的正确方法是调用entry.start()
,而不是entry.run()
@JMSilla如果你把它作为一个答案,我会投票给你。谢谢你JMSilla,它很有效。请将此作为答案发布。您还可以将字符串与==、使用next而不是nextLine()、使用空字符串初始化行、使用线程之间共享的非易失性布尔值而不是简单地使用INTERRUP()、忽略异常等进行比较。
entry = new EntryThread();
entry.run();
entry.start()