日期:2014-05-20  浏览次数:20692 次

java 线程之间传递异常 懂的进!
我现在在做一个android的程序
思路如下:假设我的程序连接服务器时间太长,或者根本不能连接到服务器,那么我规定在一定的时间比如3s或者5s之后我的程序就弹出一个不能连接的框

那么我要写一个定时器,思路是用一个守护线程,从连接之前start();让其sleep到我规定的时间,如果这段时间还没有连接成功,就报一个TimeoutException异常

但问题是,java的异常机制是向上捕获。也就是说会一层一层的向上去请求处理,没有说在线程之间可以捕获到的

那么问题来了1:如果我的这种方法不可行,请有做过类似东西的人给其他方案
  2:有么有方法可以让主线程捕获到守护线程的异常

Java code
public class Test1 extends Thread{
    public boolean isCanceled;
    @Override
    public void run() throws NullPointerException{
        throw new NullPointerException();
    }
}


public class Test2 extends Thread{

    @Override
    public void run(){
        try{
            new Test1().start();
        }catch(NullPointerException e){
            System.out.println("helloworld");
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new Test2().start();
    }
}



以上是我写的程序,结论是捕获不到

------解决方案--------------------
做个钩子函数回调不行吗
------解决方案--------------------
1,如楼上所说,回调
2,不一定非要用在主线程捕获异常这种方法,可以在守护线程里发现5s得不到连接之后,触发某个方法
------解决方案--------------------
Android提供了Handler、Looper、Message等类,可以很容易实现你说的timeout功能。
------解决方案--------------------
public class testAbnormalDeliever {
public static void main(String a[]){
Test1 x=new Test1();
  new Test2(x).start();
}

}
class Test1 extends Thread{
public boolean flag=false;
@Override
public void run() {
try {
sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//if没有连接成功 则标记为flag为true;
flag=true;
}
}


 class Test2 extends Thread{
public Test1 x=null;
 
Test2(Test1 x){
this.x=x;
}
public void run(){

x.start();
if(x.flag==true){
System.out.print("连接不成功");

}
}
  
}



貌似线程间异常传递不可实现 ,不过楼主的程序,如果把start() 函数 都换成 run() 楼主要的输出结果是可以实现的;





此外 我 用了另外一种方法 进行线程间消息传递 : 用了一个标记位;




不知道符不符合楼主的心意,先这样吧!!
------解决方案--------------------
public class testAbnormalDeliever {
public static void main(String a[]){
Test1 x=new Test1();
  new Test2(x).start();
}

}
class Test1 extends Thread{
public boolean flag=false;
@Override
public void run() {
try {
sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//if没有连接成功 则标记为flag为true;
flag=true;
}
}


 class Test2 extends Thread{
public Test1 x=null;
 
Test2(Test1 x){
this.x=x;
}
public void run(){

x.start();
if(x.flag==true){
System.out.print("连接不成功");

}
}
  
}

用一个标记位 也可以进行 进程间 消息传递;



此外楼主的程序 把start() 换成 run () 就可以了

貌似线程间异常无法传递啊!!!
不知道符不符合楼主心意,呵呵!!!
------解决方案--------------------
public class testAbnormalDeliever {
public static void main(String a[]){
Test1 x=new Test1();
new Test2(x).start();