前一段时候使用高吞吐量数据传输,现有一段程序需要用JAVA来做,通过RPC互联,里面要开200个thread,机器里面是4个MIPS处理器,来JAVA区请教下,在JAVA的thread里面会正的利用了4个处理器吗,还是只会有一个,求解惑。多谢,在线等待。

解决方案 »

  1.   

    以下仅代表我的个人观点。之前我问过我们操作系统老师。
    java 线程 对应于操作系统的 用户级线程,  
    现在操作系统多采用 用户级线程与内核线程 1对1 映射,
    而操作系统以 内核线程作为基本调度单位, 所以 java 线程可以利用多核。
    而且我写过测试在多线程的条件下 1 加到 10000000
    确实要比单线程快很多这说明  如果在 1核的情况下 利用多线程  ,那么不但不会加快  还会因为线程上下文切换 导致 计算减慢,
    所以也可以证明。 java 线程可以利用多核
      

  2.   

    java的线程是调用操作系统的线程来搞的,能不能用到多核看操作系统
      

  3.   

    看一下Thread就可以知道,jvm调用了系统api实际上线程是由系统来创建的。
      

  4.   

    我觉得这要看具体JVM的定义的线程的实现,如果调用的是OS的本地线程,是可以利用到4个CPU的。但如果是JVM自己模拟线程,那就只能利用到一个CPU,实际上也就是单线程
      

  5.   


    当然清楚了,但是 每个java 的线程还是对应着一个操作系统内核线程,目前 xp 以上 Linux  ,solaris 9 都使用 1对1 模型, 操作系统上面写的哦 
      

  6.   


    这个倒是真的。。操作系统同意 ,jvm 不同意也不行啊。。
      

  7.   

    这个是操作系统的事,它给不给一个进程中的多个线程多核处理它说了算。但是我们写的多线程程序肯定是要更快的,假设T1,T2两个线程,CPU1,CPU2两个处理器。如果是真正的多线程(即多个线程同一时间执行),线程T1不必等CPU1执行完T2的时间片而直接用CPU2的时间片,更快!如果是单单一个CPU1来执行T1,T2,那么CPU2去执行其他的任务去了,CPU1压力肯定要更小,获得时间片更快!
      

  8.   

    深思了下,觉得有道理啊,从时间片获得的方面来说,如果是一共有n个线程 那么开一个线程 分配时间片的概率是 1/n 而开2个 则是 2/(n+1) 就这个公式而言在n>1时确实恒成立 1/n < 2/(n+1)
      

  9.   

    不过开的过多也不行,CPU切换开销,以及线程的迁移