1

为这个模棱两可的标题道歉——我想不出如何用这个词来形容一个标题。

基本上,我正在尝试用 Java 创建一个简单的服务器/客户端程序。我的服务器运行一个线程来不断检查新连接,然后如果找到一个连接 - 它会为该连接创建一个线程和一个连接对象。

问题出现在检查新连接的线程上 - 它没有工作,直到我开始错误检查并在行中添加:

System.out.println("");

它突然开始正常工作。删除此行会导致不会为连接添加新线程。我认为它为线程正常运行或其他东西提供了足够的延迟,所以我放了一个 for 循环一段时间,看看它是否有效 - 但除了那一条简单的线之外,没有其他任何东西可以工作。

下面是创建新连接线程的代码:

    class ThreadCreator implements Runnable {

    ThreadCreator() {

    }

    public void run() {
        while(true) {
            System.out.println("WHY DOES THIS WORK??");
            for(int i = 0; i < connections.size(); i++) {
                if(connections.get(i).thread == false) {
                    Runnable ReadRunnable = new Read(connections.get(i));
                    Thread ReadThread = new Thread(ReadRunnable, "MWHAHAH");
                    ReadThread.setPriority(Thread.MAX_PRIORITY);
                    ReadThread.start();
                    connections.get(i).thread = true;
                    System.out.println("THREAD CREATED");
                }
            }
        }
    }
}

我无法想象会出什么问题..?

4

2 回答 2

1

感谢 Joachim - 我设法解决了这个问题!问题是用于从客户端接收消息的线程和用于查找新连接的线程都在访问同一个变量(连接列表)。

我做了少量研究(http://jeremymanson.blogspot.co.uk/2008/11/what-volatile-means-in-java.html)并将 volatile 修饰符添加到变量中 - 就我而言可以看到,确保使用该对象的任何其他线程都将被通知它已更改,从而允许它们都访问它!

还提到同步线程很重要,变量被多个线程更改。但是,我的变量被一个线程读取并被另一个线程更改,所以看起来 volatile 语句在这里就足够了!

非常感谢!

于 2013-05-15T14:35:08.633 回答
1

要记住的一件事是,System.out.println()几乎肯定会涉及同步对某个地方的调用wait()(因为println()通常会刷新并等待响应可见(或至少传递给其他进程)直到返回。

如果同步是问题,这可以轻松“修复”您的多线程程序。

于 2013-05-15T13:46:50.777 回答