首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

一个线程有关问题求解

2013-04-02 
一个线程问题求解public class Machine implements Runnable{private int a0public void run(){for(a0

一个线程问题求解
public class Machine implements Runnable{
  private int a=0;
  public void run(){
    for(a=0;a<50;a++){
      System.out.println(Thread.currentThread().getName()+":"+a);
      try{
        Thread.sleep(100);
      }catch(InterruptedException e){throw new RuntimeException(e);}
    }
  }
  public static void main(String args[]){
    Machine machine=new Machine();
    Thread t1=new Thread(machine);
    Thread t2=new Thread(machine);
    t1.start();
    t2.start();
  }
} 这个打印结果为什么a=0有2次?

[解决办法]

引用:
public class Machine implements Runnable{
  private int a=0;
  public void run(){
    for(a=0;a<50;a++){
      System.out.println(Thread.currentThread().getName()+":"+a);
      try{
……

楼主这段代码只是说明了线程的并发执行而已
至于为什么一开始输出的是两个0:
“一个线程打印了0,后睡眠,另一个线程依然从0开始打印,所以两次。”
这也是二楼说的,不过二楼后半部分说法感觉有点问题
因为你的代码根本就没有涉及到线程互斥
后续的输出无法预测,甚至有些a的值打印不出来
要互斥必须加锁

public class Machine implements Runnable{
  private int a=0;
  private Object object=new Object();
  public void run(){
  synchronized (object) {
  for(a=0;a<50;a++){
      System.out.println(Thread.currentThread().getName()+":"+a);
      try{
        Thread.sleep(100);
      }catch(InterruptedException e){throw new RuntimeException(e);}
    }
}
    
  }
  public static void main(String args[]){
    Machine machine=new Machine();
    Thread t1=new Thread(machine);
    Thread t2=new Thread(machine);
    t1.start();
    t2.start();
  }
}


热点排行