需求:线程a每隔10秒执行一次,线程b每隔100秒执行一次,线程c每隔200秒执行一次.出现的问题:通过日志观察,大部分时间内,代码是按我的期望运行的。但是,有时候,某个线程会出现非正常运行的情况:比如线程a一个小时都没有执行一次。这种情况出现的时机没有规律,有时十几个小时会出现一次,有时一个小时内会出现几次。请教:如果想实现我的需求,该如何修改代码呢?多谢~具体代码:        Thread thread_a = new Thread(new Thread_a());
Thread thread_b = new Thread(new Thread_b());
Thread thread_c = new Thread(new Thread_c));
thread_a.start();
thread_b.start();
thread_c.start();
public class Thread_a implements Runnable {
public void run() {
while (true) {
            .....//具体业务逻辑
    Thread.sleep(1000*10);
        }
}
}
public class Thread_b implements Runnable {
public void run() {
while (true) {
     .....//具体业务逻辑
     Thread.sleep(1000*100);
      }
}
}public class Thread_c implements Runnable {
public void run() {
while (true) {
    .....//具体业务逻辑
    Thread.sleep(1000*200);
}
}
}       

解决方案 »

  1.   

    问题的原因找到了,与多线程没有关系。
    原因是:在下面的代码中,长时间没有响应,卡住了,估计和网络有关系(没报异常)。
    如果下面两行代码长时间没有响应。如何跳过去,再执行一遍?            URL url = new java.net.URL(aimUrl);//aimUrl是一个网络地址,比如:www.baidu.com
                InputStream urlStream = url.openStream();
              
      

  2.   

    url.openStream(); 默认超时间是0,所以一直都不超时,网络有问题就会一直卡在那。简单的处理,就调置一下超时时间好了:URL url = new URL("http://www.baidu.com");

    URLConnection conn = url.openConnection();
    conn.setConnectTimeout(10);//连结超时,单位毫秒
    conn.setReadTimeout(10);//读超时
    conn.getInputStream();//获得流 = url.openStream();
      

  3.   


    多谢了。
    我恰好也在网上找到了答案,准备说下解决方案呢。至于是否能解决问题,还需观察下。解决方法:
    若想在Java程序中访问某个http或ftp等url指向的文件,最方便的方法莫过于使用URL类了。直接使用URL对象的openStream方法即可。本blog系统的左侧好友blog列表更新其实就是通过这个方法来实现的,但是直接使用openStream有一个问题,就是它的默认超时时间是0,也就是永远不会超时。这样,对于一些较慢的网站可能会阻塞很长时间,甚至出现死锁。因此我的好友列表文章也经常会出现更新不了的情况(我估计是这个原因)。 
           今天搜了一下有没有可行解决方案(btw,这种技术性问题还得是google),发现其实要解决也很容易,只要先使用url的openConnection方法获得一个HttpUrlConnection对象,然后该对象有setConnectTimeout和setReadTimeout两个方法,分别设置两种超时,设置完之后再调用该connection的getInputStream获得流即可。其实url的openStream就是把openConnection和getInputStream连起来调用了。