1、假设有一个客户端通过Socket连接上某个服务器,该Socket的输出流被多个线程同时共享,并同时输出若干数据,每个线程各自输出5个相同的字符串,每个线程输出的内容不同,例如线程1输出“AAAAA”,线程2输出“BBBBB”,线程3输出“CCCCC”。
服务器端接收客户端的请求数据并打印,请问服务器端接收到的数据是否都是 AAAAA,BBBBB,CCCCC这样的,还是ABCAA这样的混乱型的
2、如果一个mina做的服务端 连接了多个客户端 客户端1正在输入 10K数据的同时 其他客户端能否传输数据
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]