黑马程序员技术交流社区

标题: 多线程问题,为什么结果会打印两次,求解答!@!!! [打印本页]

作者: wzl100520    时间: 2016-5-27 19:53
标题: 多线程问题,为什么结果会打印两次,求解答!@!!!
public static void main(String[] args) {
  /*
   * 创建两个线程A和B,,,,
   * 运行10次,,,
   * 记录A线程的运行次数
   */
   Runnable runnable = new Runnable(){
    //用来记录线程A的运行次数
    int i=0;
    //用来控制运行次数
    int f=0;
    public void run() {
     while(true){
      synchronized (this) {
       //第十次结束方法打印A运行次数
       if(f==10){
        System.out.println("完毕---A运行了"+i+"次");
        return;
       }
       //等待0.5秒
       try {
        Thread.sleep(500);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
       //A线程运行则i+1
       if(Thread.currentThread().getName().equals("A")){
        i++;
        System.out.println("A线程执行运行了,次数+1");
       }
       //B线程运行,则无动作
       if(Thread.currentThread().getName().equals("B")){
        System.out.println("B线程执行不做处理");
       }
       //控制次数
       f++;
      }
     }
    }
   };
   //开启线程A和B
   new Thread(runnable,"A").start();
   new Thread(runnable,"B").start();
}
运行结果:
      A线程执行运行了,次数+1
      A线程执行运行了,次数+1
      B线程执行不做处理
      A线程执行运行了,次数+1
      A线程执行运行了,次数+1
     A线程执行运行了,次数+1
      A线程执行运行了,次数+1
     A线程执行运行了,次数+1
      B线程执行不做处理
      B线程执行不做处理
      完毕---A运行了7次
      完毕---A运行了7次
提问:为什么结果是完毕运行了两次,,,怎么避免运行两次???


作者: lifeiwangyue    时间: 2016-5-27 22:51
你的这两个线程都会去执行run方法里面的东西,所以就会出现两次 ,把里面的东西分成两个方法  通过两个rund方法
作者: wzl100520    时间: 2016-5-30 11:16
lifeiwangyue 发表于 2016-5-27 22:51
你的这两个线程都会去执行run方法里面的东西,所以就会出现两次 ,把里面的东西分成两个方法  通过两个rund ...

谢了,,,,,明白了,,,,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2