文档章节

线程超时,服务进入假死状态

Pig-man
 Pig-man
发布于 2017/09/04 14:29
字数 499
阅读 74
收藏 0

项目最近写了一个接口,设定不断的去请求第三方获得数据,由于网络等等原因,httpClient请求偶尔会超时,超时后进入假死状态,卡死。查询了一下好像是httpClient 3.x存在这种问题,在4.x后已经修复。

如果想一个别的路子:譬如,捕捉每一次httpClient请求,判断该线程的执行时间,如果超过常规值则将该线程杀掉,下面的工作则可以正常进行了。

搜罗一下有两种可行的方案。

一、CounterThread.join()方法

import java.util.concurrent.*;

/**
 * Created by liyang on 2017/9/4.
 */
public class ThreadTest {
    public static void main(String[] args) {
        CounterThread ct = new CounterThread(1314);
        ct.start();
        try {
            ct.join(5000);  //超时的时间,如5秒
            if(ct.isAlive()){//说明再设定的时间内没有执行完,超时
                ct.interrupt();
                throw new TimeoutException();//抛出,让socket线程终止
            }
            //正常情况下可以获取执行后的值
            System.out.println(ct.getResult());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }

        
        System.out.println("then,we take zhe next step!");
    }
}
class CounterThread extends Thread {
    //  构造函数,传递一些有用的值给run;
    public CounterThread(int time) {
        this.result = time;

    }
    private int result;

    public int getResult() {//在上面获取的结果值
        return result;
    }
    public void run() {
//        执行的任务,如读取客户端数据
        try {
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


二、ExecutorService.submit(Thread).get()

此方法经验证是我最喜欢的方法。

package com.ane56.Demo20170904;

import java.util.concurrent.*;

/**
 * Created by liyang on 2017/9/4.
 */
public class TimeoutTest1 {

    public static void main(String[] args) {
        final ExecutorService service = Executors.newFixedThreadPool(1);

        TaskThread taskThread = new TaskThread();
        System.out.println("提交任务...begin");
        Future<Object> taskFuture = service.submit(taskThread);
        System.out.println("提交任务...end");
        try {
            Object re = taskFuture.get(6000, TimeUnit.MILLISECONDS);//超时设置,6s
            System.out.println(re);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            System.out.println("超时 取消任务");
            taskFuture.cancel(true);
            System.out.println("超时 取消任务OK");
        } finally {
            service.shutdown();
        }

        System.out.println("then,we take zhe next step!");

    }

}

class TaskThread implements Callable<Object> {

    public Object call() throws Exception {
        String result = "空结果";
        try {
            System.out.println("任务开始....");
            Thread.sleep(5000);
            result = "正确结果";
            System.out.println("任务结束....");
        } catch (Exception e) {
            System.out.println("Task is interrupted!");
        }
        return result;
    }

}

 

 

 

© 著作权归作者所有

Pig-man
粉丝 20
博文 62
码字总数 47800
作品 0
青浦
程序员
私信 提问
《netty入门与实战》笔记-06:心跳与空闲检测

本小节,我们一起探讨最后一个话题:心跳与空闲检测 首先,我们来看一下,客户端与服务端之间的网络会存在什么问题? 1. 网络问题 下图是网络应用程序普遍会遇到的一个问题:连接假死 连接假...

Funcy1122
2018/10/22
615
0
多线程使用wait和notify做生产者消费者模型导致线程全部假死

分析假死的原因: 首先我们每次只生产一个数据,然后消费者进行消费, 生产者端代码: 消费者端 测试: 截取控制台代码部分代码: 分析:因为notify每次只唤醒一个线程,因此并不确定他唤醒的是哪一个...

大大的微笑
2017/10/28
94
0
Java多线程学习(七)

等待/通知模式中最经典的案例当属生产者/消费者模式,此模式有几种变形,但都是基于wait/notify的。 生产者/消费者模式有两种类型:操作值的和操作栈的。下面分别从这两方面来讲解生产者/消费...

kakayang2011
2016/03/07
44
0
使用线程池,一段时间后,发现有些线程假死

上一个问题:http://www.oschina.net/question/224858_119159 可能是判断有误,南辕北辙了,所以没有找到合适的方法,直到现在还没有解决. 很可能是我在线程池上处理的不得当,使用的是Threa...

布谷鸟
2013/07/26
8.4K
10
Tomcat假死超时之Windows Server 2008R2版

问题 最近Tomcat服务老是出现连接超时,主要的现象就是在Windows本机使用回环地址访问,都是无法访问状态。查了CPU,内存,网络带宽,TCP连接数,包括Tomcat的JVM内存,和CPU使用,以及实时线...

亚林瓜子
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部