A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 洋葱骑士 中级黑马   /  2014-3-2 11:52  /  818 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 洋葱骑士 于 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,问题出在哪里啊?
怎么才能就打印一遍呢。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
我运行过你的代码,没有出现两次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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 洋葱骑士 于 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());

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马