黑马程序员技术交流社区
标题:
线程中的异常问题
[打印本页]
作者:
黑马李杰
时间:
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