黑马程序员技术交流社区

标题: 多线程打印同一组数据重复 [打印本页]

作者: 洋葱骑士    时间: 2014-3-2 11:52
标题: 多线程打印同一组数据重复
本帖最后由 洋葱骑士 于 2014-3-2 12:31 编辑

public class Hello {
        public static void main(String[] args) throws ClassNotFoundException
        {
                D d = new D(0);
                Thread t1 = new Thread(d);
                Thread t2 = new Thread(d);
                t1.start();
                t2.start();
        }
}
class D implements Runnable{
        private static int num;
        D(int n){
                num= n;
        }
        public void run(){
                for(;num<20;++num)
                System.out.println(num + " " +Thread.currentThread().getName());
        }
}

请教一下啊
以上的代码打印了两遍 0,问题出在哪里啊?
怎么才能就打印一遍呢。
作者: yunzhongzhuhuo    时间: 2014-3-2 12:16
我运行过你的代码,没有出现两次0的情况,而且,由于你的for循环次数太少,基本上一个线程就给打印完了,第二个线程可能只用不上,我就给你改了一下,你看看
  1. public class Hello {
  2.         public static void main(String[] args) throws ClassNotFoundException
  3.         {
  4.                 D d = new D(0);
  5.                 Thread t1 = new Thread(d);
  6.                 t1.setName("d1");
  7.                 Thread t2 = new Thread(d);
  8.                 t2.setName("d2");
  9.                 t1.start();
  10.                 t2.start();
  11.         }
  12. }
  13. class D implements Runnable{
  14.         private static int num;
  15.         D(int n){
  16.                 num= n;
  17.         }
  18.         public void run(){
  19.                 for(;num<20;num++)
  20.                 {
  21.                         try {
  22.                                                 Thread.sleep(500);
  23.                                                 System.out.println(num + "..." +Thread.currentThread().getName());
  24.                                         } catch (InterruptedException e) {
  25.                                                 // TODO Auto-generated catch block
  26.                                                 e.printStackTrace();
  27.                                         }
  28.                        
  29.                 }
  30.         }
  31. }
复制代码

作者: 洋葱骑士    时间: 2014-3-2 12:24
本帖最后由 洋葱骑士 于 2014-3-2 12:28 编辑
yunzhongzhuhuo 发表于 2014-3-2 12:16
我运行过你的代码,没有出现两次0的情况,而且,由于你的for循环次数太少,基本上一个线程就给打印完了,第 ...

刚刚用你的程序,结果还是不对。然后还是谢谢回答
0...d1
0...d2
2...d1
3...d2
4...d1
4...d2
6...d2
6...d1
8...d1
8...d2
10...d1
10...d2
12...d1
12...d2
14...d1
14...d2
16...d1
17...d2
18...d1
19...d2
20...d1然后问题找到了:
改为如下语句后就正常了
for(;num<20;)
       System.out.println(num+++ " " +Thread.currentThread().getName());






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