黑马程序员技术交流社区

标题: 线程中的异常问题 [打印本页]

作者: 黑马李杰    时间: 2013-3-31 16:52
标题: 线程中的异常问题
如下代码: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();
    }
}   




作者: tshch1989    时间: 2013-3-31 18:22
因为继承了Runnable接口,该接口中run方法没有抛出异常,重写函数不能抛出父类没有的异常;this指的不是当前线程对象,而是当前运行的run方法位于的类对象
作者: 小黑黑    时间: 2013-3-31 18:39
1、毕老师讲过:若父类或接口无异常抛出,子类覆盖的方法出现异常,只能try,不能抛。我个人理解是:因为你继承或实现了其中的方法,那么你这个方法父类中都没出现异常,子类在复写的时候,也不能对外界提供异常。也就是说父类或接口中的方法没有异常,子类实现后也要保证同样的效果,就是说不能在方法上throws异常,因为父类的这个方法上没throws,这才叫复写,要保证复写的方法是一摸一样的。
2、要保证多个线程同步的条件之一就是要用同一把锁,及这个锁对象时一致的。加了this就是表示当前对象,对于非静态方法就是同一把锁
作者: 李万海    时间: 2013-3-31 18:44
因为 Ticket3实现了Runnable接口,而里面的run()方法是复写了Runnable接口里的run()方法,接口中的方法没有抛出异常,所以这个run方法不能抛出异常,只能try。
加this行,this指的不是当前线程对象,而是当前运行的run方法位于的类对象。四个线程必须使用同一个锁,保证同步中只用一个线程在运行,否则就会出现错误的票。
作者: 杜加璇    时间: 2013-3-31 19:26
例子实现了Runnable接口,父类中的run方法没有抛出异常,子类中重写的run方法不能抛出,只能在重写的方法内try...catch。
多线程通信必须是同一把锁,this指代的调用方法的对象,用this 保证了是同一把锁。
作者: 陈丽莉    时间: 2013-3-31 21:46
若还有问题,请继续追问; 没有的话,将帖子分类改成【已解决】~
作者: 田光峰    时间: 2013-4-3 16:02
因为 Ticket3 implements Runnable 并且复写run()方法 ,但Runnable接口 中的run方法并未抛出异常所以不用抛出异常,直接try即可。
另外this表示的是能够调用方法的类对象,不是当前线程。当多个线程共同用一个资源时必须用同一个锁,不然会出现错乱。





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