两个java通讯程序问题

1、假设有一个客户端通过Socket连接上某个服务器,该Socket的输出流被多个线程同时共享,并同时输出若干数据,每个线程各自输出5个相同的字符串,每个线程输出的内容不同,例如线程1输出“AAAAA”,线程2输出“BBBBB”,线程3输出“CCCCC”。

服务器端接收客户端的请求数据并打印,请问服务器端接收到的数据是否都是 AAAAA,BBBBB,CCCCC这样的,还是ABCAA这样的混乱型的
2、如果一个mina做的服务端 连接了多个客户端 客户端1正在输入 10K数据的同时 其他客户端能否传输数据

4个回答

Apache MINA是基于Java NIO架构的,与普通的Blocking IO的区别在于Blocking IO是阻塞式的,就像一个队列,得按先后顺序来,而NIO是非阻塞式的,这样提高了响应效率,至于LZ的问题
[quote]客户端1正在输入 10K数据的同时 其他客户端能否传输数据[/quote]
基于NIO的服务器是没有问题的。

如果是基于Blocking IO的服务器,一般在服务器端有一个线程池,一个线程处理一个客户端的请求(在线程池够用的话),每个客户端都不会相互影响。

你的输出流如果不加同步的话,那就可能是ABCAA这样的混乱型的

其他客户端当然还能传输数据,前提是mina server是针对多客户端的

没有控制,线程是并行的。如果你要看到上面混乱型的ABCAA这种结果,使用线程运行一段时间sleep(1000),这样很有可能看到这种输出。
如果要控制三个线程的顺序,使用join();一个线程完成之后再执行另一个线程。
第二个问题不用说了。

多线程共享输出流的话,如果没有对线程之间没有同步的话,那输出的内容就是混乱的,如果想按照AAAAA,BBBBB,CCCCC这样输出的话,必须线程同步。

给个经典的多线程同步的面试题:
有三个线程名字分别为A, B, C,然后让每个线程打印出自己的名字,连续打印10行,如下:
  ABC
  ABC
  ABC
  ABC
  ABC
  ABC
  ABC
  ABC
  ABC
  ABC

代码如下:
[code="java"]
package org.zergle.test;

public class TestThreadsSynchornization {
private Thread[] queue;
private int counter = 0;

public TestThreadsSynchornization(int size) {
    this.queue = new Thread[size];
    for (int i = 0; i < this.queue.length; i++) {
        this.queue[i] = new PrintThread(String.valueOf((char)(65 + i)));
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    TestThreadsSynchornization tts = new TestThreadsSynchornization(10);
    tts.start();
}


public boolean isComplete(int times) {
    return this.counter >= (times * this.queue.length);
}

public void start() {
    for (int i = 0; i < this.queue.length; i++) {
        this.queue[i].start();
    }
}

class PrintThread extends Thread {

    public PrintThread(String name) {
        this.setName(name);
    }

    public void print() {
        System.out.print(this.getName());
        if (counter % queue.length == queue.length - 1) {
            System.out.println();
        }
    }

    @Override
    public void run() {
        while (!isComplete(30000)) {
            synchronized (TestThreadsSynchornization.this) {
                if (queue[counter % queue.length] == this) {
                    this.print();
                    counter++;
                }
                TestThreadsSynchornization.this.notifyAll();
                if (!isComplete(30000)) {
                    try {
                        TestThreadsSynchornization.this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
    }

}

}

[/code]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问