liuhuimingming91
2010-03-17 12:39
浏览 253
已采纳

两个java通讯程序问题

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

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • g_johnson_lee 2010-03-18 09:30
    已采纳

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

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • wanghaolovezlq 2010-03-17 12:52

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

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

    评论
    解决 无用
    打赏 举报
  • qwe_rt 2010-03-17 13:19

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

    评论
    解决 无用
    打赏 举报
  • g_johnson_lee 2010-03-18 09:16

    多线程共享输出流的话,如果没有对线程之间没有同步的话,那输出的内容就是混乱的,如果想按照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]

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题