Java线程在不应该执行的地方停止执行';不可能

Java线程在不应该执行的地方停止执行';不可能,java,blocking,multithreading,Java,Blocking,Multithreading,我正在用java编写一个内容分发网络。我有一个Link类来管理系统中两个节点之间的套接字。有两个程序,RouterNode和DiscoveryNode 当路由器节点启动时,它要做的第一件事是尝试初始化与发现节点的连接: public RouterNode(int num) { myNumber = num; input = new Scanner(System.in); try { discoveryServer = new Socket("MONDAY

我正在用java编写一个内容分发网络。我有一个Link类来管理系统中两个节点之间的套接字。有两个程序,RouterNode和DiscoveryNode

当路由器节点启动时,它要做的第一件事是尝试初始化与发现节点的连接:

public RouterNode(int num)
{
    myNumber = num;
    input = new Scanner(System.in);

    try {
        discoveryServer = new Socket("MONDAY-PC", 60111);
        myServerLink = new Link(this, discoveryServer);
    } catch (IOException e) {
        System.out.println("Socket could not be opened. Node terminating.");
        System.exit(-1);
    }
构造器还有很多,但我的问题使我的程序无法通过这个try块

link类的构造函数(在“myServerLink=newlink(this,discoveryServer);”行上调用)如下所示:

public Link(Node n, Socket s)
{
    parentNode = n;
    regSocket = s;
    try {
        out =  new DataOutputStream(regSocket.getOutputStream());
        in = new DataInputStream(regSocket.getInputStream());
    } catch (IOException e) {
        System.out.println("Data Streams could not be created on the link.");
        e.printStackTrace();
    }


    new Thread(new LinkListenerThread(this, in)).run();
}
其中,此构造函数的最后一行启动一个新线程,该线程用于在套接字上侦听正在传递的传入消息

LinkListenerThread中的run()方法如下所示:

@Override
public void run()
{
    byte[] message;     

    System.out.println("Link now active and running.");
    while(!done)
    {
        System.out.println("attempting to read from socket...");

        try {

            // read now many bytes the following message will be
            byte[] messageLengthBytes = new byte[4];
            in.read(messageLengthBytes, 0, 4);
我的问题是,一旦我从路由器节点实例化了链接,它的执行就会从它调用.read()时阻塞它的LinkListenerThread停止。这个监听器是在一个单独的线程上运行的,所以我不确定这是否是线程中的奇怪现象,或者这只是我缺乏使用线程经验的一个例子

我的程序中还有一个实例,我在一个单独的线程上阅读

这可能是因为节点类没有显式实现runnable,因此不在它们自己的线程上

非常感谢您的帮助


编辑1:我已经让节点类实现Runnable并在它们自己的线程上启动它们,但是当调用in.read()时它仍然会锁定

使用.start()而不是.run()解决了该问题


这一切归结为对如何在java中实例化线程的误解。

使用.start()而不是.run()解决了这个问题


这一切归结为对如何在java中实例化线程的误解。

您打算通过调用
thread.run()
方法而不是
thread.start()
来启动线程。这使程序成为单线程,如果没有数据进入,或者while循环永远不会结束,那么I/O操作将阻塞try-catch子句中的唯一线程(主线程)


只需使用Thread.start()启动线程即可解决问题。

您打算通过调用
Thread.run()
方法而不是
Thread.start()
来启动线程。这使程序成为单线程,如果没有数据进入,或者while循环永远不会结束,那么I/O操作将阻塞try-catch子句中的唯一线程(主线程)


只需使用Thread.start()启动线程就可以解决问题。

这也应该移到StackOverflow,通常如果您想学习线程,最好使用一个功能更简单的程序。。您可能还应该包括完整的文件。。所以你甚至可以找到你的程序的简单版本来证明这个问题。很久没有做过java,也几乎没有做过线程,但也许“in”必须是一个线程?(如果这有意义的话)如果你不想把“in”作为一个线程,那么“in”必须完成才能继续,所以你应该做一些println来找出“in”-in.read(..)在哪里得到了stuckI,我也和一些朋友谈过,结果证明这是因为我对java线程缺乏经验。我用.start()而不是.run()开始执行线程,这个问题基本上得到了解决,很抱歉我的问题放错了地方:我甚至没有注意我在哪里发布了这个。这个问题也应该移到StackOverflow,通常如果你想学习线程,最好使用一个功能更简单的程序。。您可能还应该包括完整的文件。。所以你甚至可以找到你的程序的简单版本来证明这个问题。很久没有做过java,也几乎没有做过线程,但也许“in”必须是一个线程?(如果这有意义的话)如果你不想把“in”作为一个线程,那么“in”必须完成才能继续,所以你应该做一些println来找出“in”-in.read(..)在哪里得到了stuckI,我也和一些朋友谈过,结果证明这是因为我对java线程缺乏经验。我用.start()而不是.run()开始执行线程,这个问题基本上得到了解决。很抱歉,我的问题放错了地方:我甚至没有注意我在哪里发布了这个。