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