Java Thread停止执行它不应该执行的地方

时间:2012-01-30 16:53:06

标签: java blocking multithreading

我正在用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块。

链接类的构造函数(在'myServerLink = new Link(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);

我的问题是,一旦我从路由器节点实例化链接,它的执行将从看起来像LinkListenerThread阻止它调用in.read()时停止。这个监听器是在一个单独的线程上运行的,所以我不确定这对于线程来说实际上是不是很奇怪,或者它只是我缺乏经验的一个例子。

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

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

非常感谢任何帮助。

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

2 个答案:

答案 0 :(得分:0)

使用.start()代替.run()

解决了问题

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

答案 1 :(得分:0)

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

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