仅适用于调试模式

时间:2015-04-30 14:45:37

标签: java multithreading

我正在尝试为分布式系统创建程序。目前我有一个用于监听连接的线程,一个用于发送的线程和一个用于接收的线程。

我遇到了客户端连接的问题,但仅限于使用断点时。我根本无法弄清楚这个问题!我试图实现一些方法来减慢程序,但是没有任何工作。

如果你们可以看看我会非常感激。

    public static void main(String[] args) 
    {
        System.out.println("Server starting on port 5000");  
        RecievingConnection reciever = new RecievingConnection(5000,0); //Recieving Connection
        reciever.start();
        SendingConnection sender = new SendingConnection(5001,1); //Sending Connection
        sender.start();
        
        while(true){
            while(reciever.ready==true){ 
            System.out.println("In");
            nodes first = new nodes(reciever.socket,0);
            System.out.println("Node created");
            first.start();
            System.out.println("Client connected on port: " + reciever.socket.getLocalAddress());
            nodes second = new nodes(sender.socket,1);
            second.start();
            reciever.ready=false;
            sender.ready=false;
            reciever.connectionComplete=true;
            sender.connectionComplete=true;
            }

        }

    }

    public RecievingConnection(int port, int mode)
    {
        Serverport = port;
        connectionMode = mode;
        try{
            server = new ServerSocket(port);
            server.setSoTimeout(100000);
        }
        catch(IOException ex)
        {
            System.out.println(ex);
        }
    }
    public void run(){  
            while(true){
                if(ready == false){
                    try {
                        socket = server.accept();
                        ready = true;
                        System.out.println("Attempting to connect using port: " + Serverport);
                        while(connectionComplete == false){
                            //wait
                        }
                    } catch (IOException ex) {
                        System.out.println(ex);
                    }    
                }

            }
        }

发送线程基本上是相同的代码。知道问题是什么吗? “节点”是每个节点的线程。

3 个答案:

答案 0 :(得分:0)

你的问题几乎可以肯定:

    while (connectionComplete == false) {
        //wait
    }

这将永远循环,其他thtreads将不会获得任何CPU时间。它还解释了为什么它在调试中工作 - 这是因为在调试中如果你在断点处停止,任何其他线程都会有时间。

你至少应该这样做:

    while (connectionComplete == false) {
        //wait
        Thread.sleep(0);
    }

并且可能使用远大于0的数字。这将使其他thtreads有机会运行。

我并不是说这会使您的代码正常工作,但它应该会消除当前的问题。

之后还有另一个紧密循环,不会让任何其他线程时间。

    while (true) {
        if (ready == false) {

将其更改为:

    while (true) {
        if (ready == false) {
            // ...
        } else {
            // Here too.
            Thread.sleep(0);
        }

    }

答案 1 :(得分:0)

我通过在主线程中添加睡眠来解决它。我认为这是因为主线程优先于子线程?

答案 2 :(得分:0)

您无法在线程之间共享变量。使它们易变,同步或使用像AtomicBoolean这样的CAS类型。

了解它。

https://docs.oracle.com/javase/tutorial/essential/concurrency/interfere.html

http://www.journaldev.com/1061/java-synchronization-and-thread-safety-tutorial-with-examples

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html

除了课程"节点"这里没有描述,类应该以大写字母开头。