看看java核心技术II上的多线程部分,线程似乎不是你这里想的这样
20个线程很容易就开出来了

解决方案 »

  1.   

    "如果线程数是20,是否以为效率提高将近20倍?"
    非也非也。因为你只有一个CPU,所以某一时刻只有一个线程在工作。使用多线程的意思主要在于充分利用资源。比如说线程A在从硬盘读取数据,那么线程B就可以在这个时候利用CPU进行某些运算。如此而已。效率达不到20倍。
      

  2.   

    问题是cpu在几乎为0的时间片完全可以满足程序的运算,所以我认为在一定的线程情况下是可以这样认为(98下100个估计没有问题)
    线程增加的目的是为了充分利用带宽,因为通信的速度瓶颈是网络应答和数据的传输。希望大家都来发表意见,我明天继续加分。
      

  3.   

    带宽是固定的,如果带宽为10M,一个线程可以按此速度send/receive,那么用更多的线程来send/receive,带宽也不会增加。我认为server才需要多线程,以使server在处理请求时还可以向其他客户发数据。假设server处理每个request的优先级相同,client使用多线程只是增加了本机处理的机会,从整个网络的角度来考虑应该没有提高,而只是有点浪费。如果每个client都用很多thread,那server要同时保持那么多的连接,反而浪费了server的资源。我用netants下载pchome上的东西,使用一个连接和使用多个连接下载的总速度没有明显的区别,也许他限制了每个client使用的资源,而不是同等对待每个请求。
      

  4.   

    建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
    访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。 
      

  5.   

    建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
    访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。 
      

  6.   

    客户端多线程确可提高带宽利用率。NC浏览器是开4个,再多了也几乎不会有提高了。网络蚂蚁的默认值是6个。而线程太多(如几十)不仅提高不了带宽利用率,反因线程切换占了他多时间,会降低CPU的效率。你可在程序中由用户指定线程数。然后一一试验速度。建议4~6个。
      

  7.   

    我的看法是这样的:关于多线程提高带宽的利用率,我觉得原因可能是这样的。它所提高的并不是单纯的网络带宽的利用率,而是针对服务器而言。假如一个服务器最多可以实现10个线程(或进程),那么如果你用5个线程与它建立连接,你就占用了服务器时间片的1/2,这样,这个服务器程序有一半的时间为你服务,另一半的时间为其他的连接服务。对于Client to Server来说,多线程应该是抢占Server服务资源的好办法,但是对于Client to Client来说就没有什么太大意义了。
    其实基本思想跟masterz的意思是一样的,只是阐述的角度不同。请指教。 ;)关于线程多少问题,线程的多少只受内存大小的影响。至于性能嘛,就不知道了。有经验的高手请多多指教。
      

  8.   

    my cpu c500 memory 128MI test my computer can run 5000-7000 threads.
    but it run very slow.
      

  9.   

    我试了程序,开到20-30的线程确实可以大大提高效率
    但是每个线程组的进度还是有差异的。
    如果象robber(海盗)那样做,光线程的请求,切换,管理就要占用大量的资源,
    还是一个度的问题。
    不管是服务器还是单机,适当的线程都可以起到充分利用cpu和带宽的目的,
    好象一个房间,要求50个人进入,跑到房间尽头并返回,如果门很小,每次只够一个人进入,那么50个人依次轮流跑,大量的时间都用来等待了,如果门(cpu的线程处理能力,带宽)够宽,50个人同时进入,时间就节约了。 
      

  10.   

    //thank robber & carmon
    多谢提供实际数据。 ;)
    关于线程进度的差异,我觉得是由于操作系统调度的问题。在MS的平台下,线程调度是基于抢占式的,所以有差异。分配的时间片不是相同的。但在类UNIX系统中,使用的是轮讯的调度方法,所以你会看到分配给每个线程的时间是相等的。关于效率问题。我还是想讨论一下。不论什么样的程序,完成任务(使用CPU计算)的时间都是相等的。如果要实现carmon举的门的例子,除非是50个CPU和50条物理链路同时使用。这才是“门够宽”。如果是一台机器的话,完成所有任务的时间不可能节约。只是最后一个任务(如果排号的话)的完成时间比轮着来可能会提早,但是必定有其它任务的完成时间推迟。举例说明:如果50个程序执行的都是传输1K数据的任务,网络带宽为10K,按照carmon的例子就是同时进入,但是,数据可以同时传输吗?不能!第一个线程首先使用带宽的话,它将占用所有带宽,也就是它在1/10秒就能完成任务,然后其它的线程开始占用带宽,每次每个线程占用的都是网络的全部带宽。也就是完成所有任务必需要(1/10)*50=5秒这与50×1/10=5秒是一样的。时间是不能被节约的。节约的是什么呢?是CPU的处理能力。CPU完成程序的计算根本不要1/10秒,等待网络传输的时间是一种浪费,这些时间用来处理别的线程就提高了CPU的利用率,提高了效率。本人的一点拙见,请高人指点。谢谢! ;)
      

  11.   

    leonqin,带宽的多路复用可以简单的看成是同时进行的~
      

  12.   

    在unix下用多进程的数据库处理客户端确实可以抢到更多的资源。不管怎样讲,都还是要个度,这些属于tuning的东西,不是开发时候所需要详细知道的,留个参数可以调节就可以了。:)