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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李杰 中级黑马   /  2013-3-31 16:52  /  1731 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如下代码:Thread.sleep()方法为什么只能try异常而不能抛异常呢,synchronized()中加this不行吧,加this四个线程就不用同一把锁了吧,求大神指教
package com.innerclass.thread;

class Ticket3 implements Runnable {
    private int ticket = 100;
    public void run() {
        while(true) {
            synchronized(this) {
                if(ticket > 0) {
                    try {
                        Thread.sleep(10);
                    }catch(Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "::" + ticket--);
                }
            }
        }
    }
}

public class TicketDemo3 {
    public static void main(String[] args) {
        Ticket3 ticket3 = new Ticket3();
        new Thread(ticket3).start();
        new Thread(ticket3).start();
        new Thread(ticket3).start();
        new Thread(ticket3).start();
    }
}   



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
因为继承了Runnable接口,该接口中run方法没有抛出异常,重写函数不能抛出父类没有的异常;this指的不是当前线程对象,而是当前运行的run方法位于的类对象

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
1、毕老师讲过:若父类或接口无异常抛出,子类覆盖的方法出现异常,只能try,不能抛。我个人理解是:因为你继承或实现了其中的方法,那么你这个方法父类中都没出现异常,子类在复写的时候,也不能对外界提供异常。也就是说父类或接口中的方法没有异常,子类实现后也要保证同样的效果,就是说不能在方法上throws异常,因为父类的这个方法上没throws,这才叫复写,要保证复写的方法是一摸一样的。
2、要保证多个线程同步的条件之一就是要用同一把锁,及这个锁对象时一致的。加了this就是表示当前对象,对于非静态方法就是同一把锁

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
因为 Ticket3实现了Runnable接口,而里面的run()方法是复写了Runnable接口里的run()方法,接口中的方法没有抛出异常,所以这个run方法不能抛出异常,只能try。
加this行,this指的不是当前线程对象,而是当前运行的run方法位于的类对象。四个线程必须使用同一个锁,保证同步中只用一个线程在运行,否则就会出现错误的票。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 25分咯~

查看全部评分

回复 使用道具 举报
例子实现了Runnable接口,父类中的run方法没有抛出异常,子类中重写的run方法不能抛出,只能在重写的方法内try...catch。
多线程通信必须是同一把锁,this指代的调用方法的对象,用this 保证了是同一把锁。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问; 没有的话,将帖子分类改成【已解决】~
回复 使用道具 举报
因为 Ticket3 implements Runnable 并且复写run()方法 ,但Runnable接口 中的run方法并未抛出异常所以不用抛出异常,直接try即可。
另外this表示的是能够调用方法的类对象,不是当前线程。当多个线程共同用一个资源时必须用同一个锁,不然会出现错乱。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马