关于多线程异常处理 我已经受不了了 有几个问题真的想不明白 教材课件看了 都是云里雾里 没信心了啊啊
所以求助论坛里面的大神们 我有几个可能对你们来说好弱智的问题 希望你们给予解答
1,请问一下 java中try-catch结构中 一旦发现异常进行匹配处理不就不会到try中了吗 那我要继续检查异常怎么办 还有嵌套的异常处理是怎么回事 可以解决处理多个异常吗
2,多线程中,如果在main方法中建立了线程对象,并且调用了start方法,但是start方法后还有语句,那么程序是从start调用的run方法开始执行还是从start后开始执行啊 
3,如果仅仅有一个线程对象,那么多线程还存在吗,联系到上一个问题,start后的语句如何执行
4,同步锁是给方法或代码段上锁,给代码段上锁时,括号内的对象名是什么,怎么确定对象名。
5,wait()方法可使本线程处于阻塞状态,让其他线程有机会有机会执行,如果其他的线程与之前的线程执行的设计同一块代码,那么它不也会执行wait()吗,那么notify就没机会被执行了,而notify()可以唤醒之前的线程,那么这样的话程序如何继续进行
就这些 我知道有点幼稚 但是真的需要别人教教我 跪求 感谢

解决方案 »

  1.   

    一点浅见: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()可以唤醒之前的线程,那么这样的话程序如何继续进行
    --看着挺复杂的,这个就是多线程设计要注意的地方了。既然能想到这样的场景,就应该考虑如何规避,或者换一种方式实现。
      

  2.   

    谢谢你 我对第四个和第五个问题还有些疑问 正在执行的对象实体指的是什么 我会在楼下举个例子 请您解释一下 至于第五个问题 我再换种问法问一遍啊 如果一个线程在同步块执行到wait了,另一个线程若要执行同一个同步块,那么谁去调用notify,程序还能进行吗?这个算是死锁吗
      

  3.   

    例子
    火车票订票代码 
    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(); 
     
        } 

     
      

  4.   

    第四个: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
      

  5.   

    谢谢你 我对第四个和第五个问题还有些疑问 正在执行的对象实体指的是什么 我会在楼下举个例子 请您解释一下 至于第五个问题 我再换种问法问一遍啊 如果一个线程在同步块执行到wait了,另一个线程若要执行同一个同步块,那么谁去调用notify,程序还能进行吗?这个算是死锁吗
    一般遇到这样的问题。先notify,再wait,只要保证wait之前先notify就不会死锁。如果按照你的做法,先wait可能就死在那了。
      

  6.   

    1 可以将try cache放在循环内;嵌套可以根据选择捕捉不同的Exception,也可以使用相同的Exception来控制流程跨越;
    2 start后就执行;
    3 除了一个线程对象,还有一个主线程呢,所以还是start后执行;
    4 呵呵;
    5 注意线程控制。