日期:2014-05-20  浏览次数:20635 次

for循环创建多线程
用一个for循环创建多线程,用匿名内部类
  for(int i=0;i<10;i++){
    Thread th = new Thread(new Runnable(){
      public void run(){
        System.out.println(i);// 这个值要求要打印出0、1、2、3、4、5、6、7、8、9
      } 
    })
  }
不能打印出 0、2、3、3、6、7、8、8、9、9
要怎么样保证当for循环的i等于0的时候,内部类里面打印的值是0,当for循环的i等于1的时候,内部类里面打印的值是1;

------解决方案--------------------
是要多线程交替打印0,1,2....吗?这么写肯定不行~
------解决方案--------------------
你这涉及到并发访问的问题了。
你那个i是定义在外部的。
举个例子,一个线程访问了,然后输出,还未+1,这时候另一个线程也访问了,也输出,这时第一个线程+1,第二个线程+1,
输出的结果就应该是0  0   2   2
自然就不对了。
我没看明白你想要什么样的结果,你可以发你预想的结果我看下。
大体上理解的话你给i该应该加一把并发锁,当然这个锁好像只能加在方法上,那就把i定义为类的成员变量,然后提供get  set方法,对set方法加锁。
------解决方案--------------------
说下思路吧:
1.每个打印可是一个打印实例service,比如打印0的为class service0
2.核心思想是,通过锁,具体是一个打印对象持有他前后两个打印对象的锁(用来控制顺序)
3.这样不仅可以满足0~9 ,多少多可以循环交替打印
------解决方案--------------------
这个不行。



 for(int i=0;i<10;i++){
    Thread th = new Thread(new Runnable(){//而且这样写也报错,可以写成new Thread(new Runnable(){,
      public void run(){
        System.out.println(i);// 这个i都会报错
      } 
    })
  }


------解决方案--------------------
for(int i=0;i<10;i++){
            final int f = i;//传值用。
            Thread th = new Thread(new Thread(){
              public void run(){
                System.out.println(f);//只能访问外部的final变量。