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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沙漠里的小鱼 黑马帝   /  2012-2-26 21:55  /  2423 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沙漠里的小鱼 于 2012-2-26 22:29 编辑

public class Hello implements Runnable {
        private int count=50;
        public void run(){
                for(int i=0;i<100;i++){
                        if (count >0)
                          Thread.sleep(1000);
                        System.out.println(count--);
                       }
                }       
               
    public static void main(String[] args) {
       
                        Hello t=new Hello();
                        Thread h =new Thread(t);
                        Thread e=new Thread(t);
                        h.start();
                        e.start();
                }
               
}
我在里面加了个 Thread.sleep(1000);  怎么 运行不了了啊

17 个回复

倒序浏览
public void run(){
                for(int i=0;i<100;i++){
                        if count >0
                        System.out.println(count--);
                       }
                }  

if 后面的要用括号括起来啊,那样才能代表一个语句啊
public class Hello implements Runnable
{
    private int count=50;
    public void run(){
            for(int i=0;i<100;i++)
            {
                    if (count >0)
                    System.out.println(count--);
                   }
            }
}
回复 使用道具 举报
朱皓 发表于 2012-2-26 22:14
public void run(){
                for(int i=0;i0
                        System.out.println(count- ...

我是说运行的结果有问题 运行结果是 50
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
49
回复 使用道具 举报
语法错误,要这样if()
回复 使用道具 举报
沙漠里的小鱼 发表于 2012-2-26 22:21
我是说运行的结果有问题 运行结果是 50
48
47

没问题,线程执行看的是优先级,不是先后顺序,所以输出结果不是预期的那样
回复 使用道具 举报
本帖最后由 吴璞玉 于 2012-2-26 22:28 编辑

我看是可以运行的,if条件写好。
结果是50没错啊,因为两个线程操作的是同一数据,相当于两个窗口一起出售50张票一样
要说的话就是安全问题了
回复 使用道具 举报
朱皓 中级黑马 2012-2-26 22:26:17
7#
本帖最后由 朱皓 于 2012-2-26 22:40 编辑

你想要什么样的结果啊 ,出现这样是很正常啊,这个是两个线程公用了一份资源的结果啊
一个线程执行到49的时候被另一线程抢去了执行权,所以就从48开始输出,到这个线程执行完了,
刚刚那个线程又抢回了执行权,就把49输出了.过程就是这样
其实你因该这样写,更方便分析问题
public class Hello implements Runnable
{
    private int count=50;
    public void run()
    {
            for(int i=0;i<100;i++)
            {
                    if (count >0)
                    System.out.println(Thread.currentThread().getName()+":"+ count--);
            }
     }
}
回复 使用道具 举报
蓝色火焰 发表于 2012-2-26 22:24
没问题,线程执行看的是优先级,不是先后顺序,所以输出结果不是预期的那样 ...

那我加了咯 Thread.sleep(1000); 怎么程序就运行不了了
回复 使用道具 举报
杨盼 中级黑马 2012-2-26 22:35:09
9#
你没抛出异常吧
回复 使用道具 举报
本帖最后由 蓝色火焰 于 2012-2-26 22:40 编辑

下面是加了Thread.Sleep(1000)的运行结果
50504948474746464544434342424140393938373636343533323131·······
回复 使用道具 举报
蓝色火焰 发表于 2012-2-26 22:36
下面是加了Thread.Sleep(1000)的运行结果
50504948474746464544434342424140393938373636343533323131·· ...

我加Thread.Sleep(1000)怎么运行不了啊
回复 使用道具 举报
没捕获异常,怎么运行。伤不起
回复 使用道具 举报
本帖最后由 蓝色火焰 于 2012-2-26 23:08 编辑

程序报错了没?有没有抛出异常啊,还有把Thread.Sleep(1000)和输出语句用大括号括起来
回复 使用道具 举报
  1. class MyThread implements Runnable{

  2.         private int count=50;
  3.         public void run() {
  4.                 // TODO Auto-generated method stub
  5.                 for(int i=0;i<100;i++){
  6.                         if(count>0){
  7.                                 try {
  8.                                         Thread.sleep(1000);
  9.                                 } catch (InterruptedException e) {
  10.                                         // TODO Auto-generated catch block
  11.                                         e.printStackTrace();
  12.                                 }
  13.                                 System.out.print(count--);
  14.                         }
  15.                 }
  16.         }
  17.        
  18. }
复制代码
试试这个
回复 使用道具 举报
你让每个线程都休1000秒那多线程的乱序性当然就体现不出来了。
多线程最主要体现它的乱序性,每个线程运行到sleep都会休息等下个线程运行,
所以结果都是连续的。
回复 使用道具 举报
张乃智 发表于 2012-2-26 23:35
你让每个线程都休1000秒那多线程的乱序性当然就体现不出来了。
多线程最主要体现它的乱序性,每个线程运行 ...

1000毫秒哦!=1秒!
回复 使用道具 举报
本帖最后由 舞动的心弦 于 2012-2-27 13:32 编辑

额,是这样的,你这个问题首先是:
1.你的if语句没有加大括号
2.你if后面的"()"是中文的括号
3.你在线程挂起(休眠)时没有进行异常处理
下面是我的代码,你看看吧,希望有所帮助:
  1. public class Hello implements Runnable {
  2.         private int count=50;
  3.         public void run(){
  4.                 for(int i=0;i<100;i++){
  5.                         if (count >0){
  6.                           try {
  7.                                                         Thread.sleep(1000);
  8.                                                 } catch (InterruptedException e) {
  9.                                                         // TODO Auto-generated catch block
  10.                                                         e.printStackTrace();
  11.                                                 }
  12.                         System.out.println(count--);
  13.                        }
  14.                 }
  15.                 }        
  16.                
  17.     public static void main(String[] args) {
  18.         
  19.                         Hello t=new Hello();
  20.                         Thread h =new Thread(t);
  21.                         Thread e=new Thread(t);
  22.                         h.start();
  23.                         e.start();
  24.                 }
  25.                
  26. }
复制代码
运行结果:

50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0



回复 使用道具 举报
舞动的心弦 发表于 2012-2-27 13:26
1000毫秒哦!=1秒!

额   一时没注意:L
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马