当前位置:编程学习 > JAVA >>

有关多线程和异常处理 我彻底凌乱了 一个初学者的自白求助帖

关于多线程异常处理 我已经受不了了 有几个问题真的想不明白 教材课件看了 都是云里雾里 没信心了啊啊
所以求助论坛里面的大神们 我有几个可能对你们来说好弱智的问题 希望你们给予解答
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()可以唤醒之前的线程,那么这样的话程序如何继续进行
--看着挺复杂的,这个就是多线程设计要注意的地方了。既然能想到这样的场景,就应该考虑如何规避,或者换一种方式实现。
--------------------编程问答--------------------
引用 4 楼 oh_Maxy 的回复:
一点浅见:

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(); 
 
    } 

  --------------------编程问答--------------------
引用 6 楼 huyiming123 的回复:
例子
火车票订票代码 
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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,