for(i=0;i<100;i++)
  System.out.println("hello world");
想上面这样的循环可不可能出现输出hello之后线程就被切换成另一个了

解决方案 »

  1.   

    你查一下 System.out 对象的 println 代码,里面有同步块,
    所以,输出时,要么不输出,要么参数内容全输出。
      

  2.   

    从程序的逻辑性来讲,Sun当时设计JDK API的时候肯定考虑了这个问题的,所以必定是有线程同步保护的,要不然不就乱了
    不过楼主倒是可以研究一下StringBuffer和StringBuilder的区别,听说就是一个线程不安全一个线程安全。当然,线程安全的类肯定比线程不安全的类要稍慢
      

  3.   

    回复1楼:那如果我在循环里面有多条输出语句,通过代码运行的结果看全多是这些输出语句一起输出,只有在中间穿插sleep语句才会出现线程切换,那线程切换的最小单元到底是什么,是语句还是代码块?
      

  4.   

    “请问java多线程的线程切换的最小单元是什么,是语句还是代码块”
    都不对。首先,切换线程的本质上其实是操作系统。时机点的话,其实可以说是想切换就切换,或者说到CPU指令这个粒度。那么,别说你这个循环了,即便是:
      i++
    这看似一句代码,执行时都可以切换几次线程。
    对了,即便你使用 同步块,对线程切换还是没有任何影响的。
      

  5.   

    例如如下代码
    public void run(){
         for(int i=0;i<5;i++){
         for(long k=0;k<1000000;k++);
         System.out.println(name+":"+i);       //1
         System.out.println("线程未结束");     //2
         }
         System.out.println("线程结束");
         }
    为什么每次1,2两处的输出总是接连的输出,有没有可能出现A线程在1处输出后,切换到另一个线程输出1处代码,而不是A接着输出2处代码
      

  6.   

    谁能推荐一些关于java多线程的博客或是文章