我现在的代码是,单个线程向服务器发送指令。使用短连接。既:建立SOCKET,发送一次报文,断开SOCKET。(事实证明此方法非常慢,而且占用端口太多)现在我想改为:建立SOCKET,多线程发送N次报文(N>2W),断开SOCKET。主要对JAVA不熟,不知道如何下手。:(我的问题:
1.如果改为后种方式,那与:建立SOCKET,单线程发送2w次报文是否有区别,区别在哪里?
2.线程间是如何工作的?是排好队一个一个执行么?会不会这里执行一行,那边执行一行?很迷惑。望高人指点。希望快速解决问题。

解决方案 »

  1.   

    麻烦,
    方法1: 数据谁产生的,谁负责发送就行,不用考虑什么线程问题
    方法2:看看生产者消费者模式。 数据产生视同生产者,数据发送视同消费者 参考这个 http://www.java2000.net/p581 
      

  2.   

    这要主看你每次发送的数据量是多少,如果建立一次连结只发送一个 hello,world,那太不合算了.可以多个线程发送的内容往一个容器中扔,然后用几个线程专门负责发送,每个负责一个socket,这样模型比较清楚.即使只需要一个socket发送,多个线程共同用一个socket发送虽然可以,但模型不清楚.
    多个线程应该是共用一个接收发送信息的"产品容器"而不是共用socket,socket从这个容器中不断获取要发送的内容边续发送.
    至于多长时间重建一次socket,这要看系统本身对socket的最大生命周期的限制,应该小于这个时间,建议最大存活期为30分钟.
    总线程数不要超过cpu * 25.
      

  3.   

    谁负责产生,谁负责发送,不好,因为产生一个字节也是产生,产生1M也是产生,销毁后再次初始化要消耗大量资源。如果说模式,我觉得应该用....呃....就象那个线程池一样的那个模式......就是一次初始化那么N个SOCKET,引用放在LIST里面,用的时候取,取的时候个数减一,用完了放回去,个数加一.........叫什么模式来着?..........
      

  4.   

    呵呵,干嘛要断socket啊,发送后flush就行了,发送自然是多线程发送的不用把一条信息分段,你的网络程序自然是多线程管理交互数据的。就算多条线程同时发送信息你也不用考虑系统能不能发送的出去,系统不会发错地方的肯定也能发的出去。1m几k多条数据系统处理不来那机器就该扔了。还有broadcast用的方式还是for发送,因为到现在为止还没见过对大批量数据有更好的广播方式呢