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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周刚 中级黑马   /  2012-7-11 23:28  /  1504 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;

public class TestSync implements Runnable {

        /**
         * @param args
         */
        Timer timer = new Timer();

        public static void main(String[] args) {
                TestSync test = new TestSync();
                Thread t1 = new Thread(test);
                Thread t2 = new Thread(test);
                t1.setName("t1");
                t2.setName("t2");
                t1.start();
                t2.start();

        }

        public void run() {
                timer.add(Thread.currentThread().getName());
        }
}

class Timer {
        private static int num = 0;
        public void add(String name) {
                num++;
                try {
                        Thread.sleep(1);
                } catch (InterruptedException e) {
                        System.out.println(name + ",你是第" + num + "个使用timer的人");
                }
        }
}
为什么没有正确的输出???

4 个回复

倒序浏览
因为你没有写输出语句
import java.util.*;

public class TestSync implements Runnable {

        /**
          * @param args
          */
         Timer timer = new Timer();

        public static void main(String[] args) {
                 TestSync test = new TestSync();
                 Thread t1 = new Thread(test);
                 Thread t2 = new Thread(test);
                 t1.setName("t1");
                 t2.setName("t2");
                 t1.start();
                 t2.start();

        }

        public void run() {
                 timer.add(Thread.currentThread().getName());
         }
}

class Timer {
         private static int num = 0;
         public void add(String name) {
                 num++;
                 try {
                         Thread.sleep(1);
                 } catch (InterruptedException e) {
                         System.out.println(name + ",你是第" + num + "个使用timer的人");  //在这里输出只是catch的语句,在没有抓到异常,没有输出
                 }
                 System.out.println(name + ",你是第" + num + "个使用timer的人");   //打印语句放在这里才会打印出结果
         }
}
回复 使用道具 举报
本帖最后由 张莹莹 于 2012-7-12 01:08 编辑

1、首先需要在main函数中调用t1.interrupt()和t2.interrupt()方法,这样当线程阻塞时,被中断时会抛出InterruptedException异常,否则不会抛出InterruptException异常,自然也没输出结果
2、对于num数的累加不正确,会有竞争问题,需要互斥访问,修改后的代码如下

public class TestSync implements Runnable {

        /**
         * @param args
         */
        Timer timer = new Timer();

        public static void main(String[] args) {
                TestSync test = new TestSync();
                Thread t1 = new Thread(test);
                Thread t2 = new Thread(test);
                t1.setName("t1");
                t2.setName("t2");
                t1.start();
                t2.start();
                t1.interrupt();
                t2.interrupt();
        }

        public void run() {
                timer.add(Thread.currentThread().getName());
        }

}

class Timer {
        private static int num = 0;

        public synchronized void addNum(String name) {
                num++;
                System.out.println(name + ",你是第" + num + "个使用timer的人");
        }
        
        public void add(String name) {
                addNum(name);
                try {
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                        System.out.println(name + "被中断了");
                }
        }
}
回复 使用道具 举报
因为你把输出语句放到catch里了
回复 使用道具 举报
本帖最后由 贾存双 于 2012-7-12 09:49 编辑

public class TestSync implements Runnable {
        Timer timer = new Timer();  //实例化timer
        public static void main(String[] args) {
                Thread t1 = new Thread(test,"t1");
                Thread t2 = new Thread(test,"t2");           
                t1.start();   
                t2.start();
        }
        public void run() {  //覆写run()方法
                try{     System.out.println(timer.add(Thread.currentThread().getName()));   //调用timer.add()方法并打印返回结果。
  }catch(Exception e){       //如果有异常,会返回到这里
   e.printStackTrace() ;
  }
        }
}
class Timer {
        int num = 0;  //这里不能定义为私有的 静态的
        public String add(String name)throws Exception {  //之前你这里定义的是无返回值类型的方法,因为没有异常,所以不会返回显示任何信息。
                                try {
                        Thread.sleep(2);  //不管这里休眠设多长时间它只休眠一次,因为你这方法设计的不合理;
                } catch (Exception e) {
                       throw e;
                }
                 num++; //还有应该把 num ++ 放在休眠线程的下面,不然你上面的休眠没用,因为所有线程都等休眠结束呢,而num在上面的话只会在下面打印出最大那个数。
               return  name + ",你是第" + num + "个使用timer的人" ;
        }
}

//我不明白你的代码写这么乱有什么意义没???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马