线程不作为线程工作

时间:2015-05-23 10:54:11

标签: java multithreading

我对一个帖子有一些奇怪的(或至少对我来说很奇怪)问题。我有这样的主力

public class Main {
public static void main(String[] args) {
    int port = 5555;
    String server = "127.0.0.1";
    int x=20, y=20, squareSize = 25;


    Thread connectionManager = new ConnectionManager(server, port, x, y);
    connectionManager.run();
    System.out.print("BUM");

其中ConnectionManager是

public class ConnectionManager extends Thread{
private String server;
private int port;
private int x;
private int y; //dlugosc mapy

private Socket socket;
private int[][] currentMap;
File file;
PrintWriter printWriter;

public ConnectionManager(String server, int port, int x, int y) {
    this.server = server;
    this.port = port;
    this.x = x;
    this.y = y;
    currentMap = new int[x][y];

}

public int[][] getCurrentMap() {
    return currentMap;
}

@Override
public void run() {

    try {
        socket = new Socket(server, port);
        DataInputStream is = new DataInputStream(socket.getInputStream());

        while (true) {
            if (is.readBoolean() == true)
            {

                for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        currentMap[i][j] = is.readInt();
                    }
                }
            }

        }
    }
    catch (IOException e) {
        e.printStackTrace();
    }

}
}

但即使我的connectionManager是一个线程,它也不会转到System.out.println,除非从服务器关闭连接。我已经考虑了一段时间了,我无法弄清楚它为什么不起作用。

不要认为重要但main和connectionManager在其他maven模块中(主要在GUI模块中,它依赖于ConnectionManager的模块)

我很感激任何建议。

2 个答案:

答案 0 :(得分:5)

如果直接运行run()方法,那么实际上并没有在新线程中运行它。

要实际启动线程来执行任务,您必须运行其start()方法。在引擎盖下,它创建一个本机线程并将控制传递给它,而另一个线程是运行run()方法的线程。

答案 1 :(得分:2)

调用connectionManager.run()不会产生线程。它只是调用run并等待它完成以到达System.out行。

要在单独的帖子中运行run方法,您需要致电connectionManager.start()。请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start()