有关多线程和异常处理 我彻底凌乱了 一个初学者的自白求助帖
关于多线程异常处理 我已经受不了了 有几个问题真的想不明白 教材课件看了 都是云里雾里 没信心了啊啊所以求助论坛里面的大神们 我有几个可能对你们来说好弱智的问题 希望你们给予解答
1,请问一下 java中try-catch结构中 一旦发现异常进行匹配处理不就不会到try中了吗 那我要继续检查异常怎么办 还有嵌套的异常处理是怎么回事 可以解决处理多个异常吗
2,多线程中,如果在main方法中建立了线程对象,并且调用了start方法,但是start方法后还有语句,那么程序是从start调用的run方法开始执行还是从start后开始执行啊
3,如果仅仅有一个线程对象,那么多线程还存在吗,联系到上一个问题,start后的语句如何执行
4,同步锁是给方法或代码段上锁,给代码段上锁时,括号内的对象名是什么,怎么确定对象名。
5,wait()方法可使本线程处于阻塞状态,让其他线程有机会有机会执行,如果其他的线程与之前的线程执行的设计同一块代码,那么它不也会执行wait()吗,那么notify就没机会被执行了,而notify()可以唤醒之前的线程,那么这样的话程序如何继续进行
就这些 我知道有点幼稚 但是真的需要别人教教我 跪求 感谢 --------------------编程问答-------------------- 求别沉啊啊啊 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 怎么样啊啊啊啊啊啊
--------------------编程问答-------------------- 一点浅见:
1,请问一下 java中try-catch结构中 一旦发现异常进行匹配处理不就不会到try中了吗 那我要继续检查异常怎么办 还有嵌套的异常处理是怎么回事 可以解决处理多个异常吗
--try-catch结构中,如果try中出现异常,而且此异常在catch块中有对应的异常类型,则程序会跳到此catch块中,然后是不会再回到try中了。如果说希望try中的流程继续走,请分开try-catch,比如原来是:
try{
code 1;
code 2;
}catch(XXX1_Exception e1){
code 1 异常处理;
}
catch(XXX2_Exception e2){
code 2 异常处理;
}
改为:
try{
code 1;
}catch(XXX1_Exception e1){
code 1 异常处理;
}
try{
code 2;
catch(XXX2_Exception e2){
code 2 异常处理;
}
关于嵌套异常,请举个例子吧。
2,多线程中,如果在main方法中建立了线程对象,并且调用了start方法,但是start方法后还有语句,那么程序是从start调用的run方法开始执行还是从start后开始执行啊
--主线程会继续走(执行start方法调用后的语句),在start处另启一个线程执行run里的内容。
3,如果仅仅有一个线程对象,那么多线程还存在吗,联系到上一个问题,start后的语句如何执行
--主线程可以当做是一条主干道,start的话,相当于有条岔路,去做别的事情了。没有什么存在不存在的,得看你怎么用了。
4,同步锁是给方法或代码段上锁,给代码段上锁时,括号内的对象名是什么,怎么确定对象名。
--可以用this关键字,表示当前正在执行的对象实体。
5,wait()方法可使本线程处于阻塞状态,让其他线程有机会有机会执行,如果其他的线程与之前的线程执行的设计同一块代码,那么它不也会执行wait()吗,那么notify就没机会被执行了,而notify()可以唤醒之前的线程,那么这样的话程序如何继续进行
--看着挺复杂的,这个就是多线程设计要注意的地方了。既然能想到这样的场景,就应该考虑如何规避,或者换一种方式实现。
--------------------编程问答--------------------
谢谢你 我对第四个和第五个问题还有些疑问 正在执行的对象实体指的是什么 我会在楼下举个例子 请您解释一下 至于第五个问题 我再换种问法问一遍啊 如果一个线程在同步块执行到wait了,另一个线程若要执行同一个同步块,那么谁去调用notify,程序还能进行吗?这个算是死锁吗 --------------------编程问答-------------------- 例子
火车票订票代码
package com.yan.test;
public class TestRunnableTicket implements Runnable {
int i = 100;
public void run() {
while (true) {
synchronized (this) {
if (i > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "(- -)" + i--);
} else {
break;
}
}
}
}
public static void main(String args[]) throws InterruptedException {
TestRunnableTicket ru = new TestRunnableTicket();
Thread t = new Thread(ru);
Thread t1 = new Thread(ru);
Thread t2 = new Thread(ru);
t.start();
t1.start();
t2.start();
}
}
--------------------编程问答--------------------
第四个:this,就是自己本身。比如这里的t t1 t2,都是同样的synchronized(this),实际上对应的分别为t t1 t2这三个对象了。this用的比较多的地方,比如,单例情况下,大家都调用同一个对象的时候,会体现效果。
第五个:
用的比较少,个人这么理解的:比如a、b两个对象,a.wait()了,可以将a索引传递给b,然后b经过逻辑,调用a.notify()。建议LZ可以在CSDN博客去查查资料,看看wait和notify的正确使用方法。
刚才自己也搜了下,基本上和我预想的差不多:http://blog.sina.com.cn/s/blog_62dfe3ca0100k9tf.html --------------------编程问答-------------------- 三言两语说不清,楼主还是先搞清线程的概念吧 --------------------编程问答-------------------- 谢谢你 我对第四个和第五个问题还有些疑问 正在执行的对象实体指的是什么 我会在楼下举个例子 请您解释一下 至于第五个问题 我再换种问法问一遍啊 如果一个线程在同步块执行到wait了,另一个线程若要执行同一个同步块,那么谁去调用notify,程序还能进行吗?这个算是死锁吗
一般遇到这样的问题。先notify,再wait,只要保证wait之前先notify就不会死锁。如果按照你的做法,先wait可能就死在那了。 --------------------编程问答-------------------- 1 可以将try cache放在循环内;嵌套可以根据选择捕捉不同的Exception,也可以使用相同的Exception来控制流程跨越;
2 start后就执行;
3 除了一个线程对象,还有一个主线程呢,所以还是start后执行;
4 呵呵;
5 注意线程控制。
补充:Java , Java SE