Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Println和线程_Java_Multithreading - Fatal编程技术网

Java中的Println和线程

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

我正在用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 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()