黑马程序员技术交流社区

标题: 帮我看看我这个程序哪错了啊 [打印本页]

作者: 沙漠里的小鱼    时间: 2012-2-26 21:55
标题: 帮我看看我这个程序哪错了啊
本帖最后由 沙漠里的小鱼 于 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);  怎么 运行不了了啊
作者: 朱皓    时间: 2012-2-26 22:14
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:21
朱皓 发表于 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

作者: 李晓俊老师    时间: 2012-2-26 22:22
语法错误,要这样if()
作者: 杨盼    时间: 2012-2-26 22:24
沙漠里的小鱼 发表于 2012-2-26 22:21
我是说运行的结果有问题 运行结果是 50
48
47

没问题,线程执行看的是优先级,不是先后顺序,所以输出结果不是预期的那样
作者: 吴璞玉    时间: 2012-2-26 22:26
本帖最后由 吴璞玉 于 2012-2-26 22:28 编辑

我看是可以运行的,if条件写好。
结果是50没错啊,因为两个线程操作的是同一数据,相当于两个窗口一起出售50张票一样
要说的话就是安全问题了
作者: 朱皓    时间: 2012-2-26 22:26
本帖最后由 朱皓 于 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:31
蓝色火焰 发表于 2012-2-26 22:24
没问题,线程执行看的是优先级,不是先后顺序,所以输出结果不是预期的那样 ...

那我加了咯 Thread.sleep(1000); 怎么程序就运行不了了
作者: 杨盼    时间: 2012-2-26 22:35
你没抛出异常吧
作者: 杨盼    时间: 2012-2-26 22:36
本帖最后由 蓝色火焰 于 2012-2-26 22:40 编辑

下面是加了Thread.Sleep(1000)的运行结果
50504948474746464544434342424140393938373636343533323131·······
作者: 沙漠里的小鱼    时间: 2012-2-26 22:48
蓝色火焰 发表于 2012-2-26 22:36
下面是加了Thread.Sleep(1000)的运行结果
50504948474746464544434342424140393938373636343533323131·· ...

我加Thread.Sleep(1000)怎么运行不了啊
作者: 马胜平    时间: 2012-2-26 23:06
没捕获异常,怎么运行。伤不起
作者: 杨盼    时间: 2012-2-26 23:07
本帖最后由 蓝色火焰 于 2012-2-26 23:08 编辑

程序报错了没?有没有抛出异常啊,还有把Thread.Sleep(1000)和输出语句用大括号括起来
作者: 杨盼    时间: 2012-2-26 23:09
  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. }
复制代码
试试这个
作者: 张乃智    时间: 2012-2-26 23:35
你让每个线程都休1000秒那多线程的乱序性当然就体现不出来了。
多线程最主要体现它的乱序性,每个线程运行到sleep都会休息等下个线程运行,
所以结果都是连续的。
作者: 黄方    时间: 2012-2-27 13:26
张乃智 发表于 2012-2-26 23:35
你让每个线程都休1000秒那多线程的乱序性当然就体现不出来了。
多线程最主要体现它的乱序性,每个线程运行 ...

1000毫秒哦!=1秒!
作者: 黄方    时间: 2012-2-27 13:30
本帖最后由 舞动的心弦 于 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-28 08:29
舞动的心弦 发表于 2012-2-27 13:26
1000毫秒哦!=1秒!

额   一时没注意:L




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