Java 服务器应用程序:仅适用于println输出

Java 服务器应用程序:仅适用于println输出,java,multithreading,Java,Multithreading,为这个模棱两可的标题道歉——我想不出如何用这个词来形容这个标题 基本上,我只是在玩用Java创建一个简单的服务器/客户机程序。我的服务器运行一个线程来不断地检查新的连接,然后如果找到了连接,它就会为该连接创建一个线程和一个连接对象 问题出现在检查新连接的线程上-它不起作用,直到我开始错误检查并在行中添加: System.out.println(""); 它突然开始正常工作。删除此行不会导致为连接添加新线程。我假设它提供了足够的延迟,线程可以正常运行,所以我在for循环中放置了一段时间,看看这是

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

基本上,我只是在玩用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");
                }
            }
        }
    }
}
类ThreadCreator实现可运行{
ThreadCreator(){
}
公开募捐{
while(true){
System.out.println(“为什么这样做?”);
对于(int i=0;i

我无法想象会出什么问题。

需要记住的一件事是,
系统.out.println()
几乎肯定会涉及同步和对
wait()
的调用(因为
println()
通常会进行输出刷新,并等待响应可见(或至少传递到其他进程)直到回来


如果同步是一个问题,这可以很容易地“修复”多线程程序。

多亏了Joachim-我成功地修复了这个问题!问题是用于接收客户端消息的线程和用于查找新连接的线程都访问了同一个变量(连接列表)

我做了少量的研究()并将volatile修饰符添加到变量中——据我所知,这确保了使用该对象的任何其他线程都会收到该对象已更改的通知,从而允许它们都访问该对象

还有人提到同步线程很重要,因为变量被多个线程更改。但是,我的变量被一个线程读取,被另一个线程更改,所以这里的volatile语句似乎已经足够了


非常感谢!

一种可能性是,如果没有该行,循环运行得太快,会占用所有可用的CPU。请检查是否使用
睡眠
替换它。您的权利,我为线程添加了一个睡眠命令,这也行得通-我不认为它“占用了所有的CPU”-因为它只连接到一个线程client@KevinWatson没有如果它是“只有一个客户机”,没有
线程。sleep()
语句将导致此
while
循环执行得非常快。尝试在
while
循环中添加一个计数器,您就会明白我的意思。我知道它执行得有多快,但while循环不会占用所有可用的CPU(不是吗-我检查过)代码有点错误…你能给我们看一下连接声明吗?输入Thread.currentThread().sleep(1000)似乎“起作用”。我认为这仍然是一个问题,尽管它“起作用”?这表明什么?如果没有更多的细节,很难判断。可能是某个变量缺少一个
volatile
,或者您缺少正确的同步,或者您使用的是非线程安全对象,…我不知道volatile是什么意思直到你提到它。我研究了它,发现两个线程(一个监听消息,一个寻找连接)我们都在访问连接对象的arraylist!因此我将arraylist设置为一个易失性变量,并且成功了!我可能应该进一步研究多线程!@Kevin Watson,我在生产中的一个应用程序中遇到了类似的问题。请您将更新后的代码与“易失性”共享?我试图发布答案,但我必须获得超过10分或w/e。更新的代码没有什么特别之处,我只是简单地更改了:public ArrayList connections=new ArrayList();改为:public volatile ArrayList connections=new arrarylist()这意味着使用同一个变量的两个线程可以在变量被更新时互相告知!希望有帮助!你真的应该考虑使用JavaUTIL并发包中的类而不是创建自己的线程。