java多线程检测可用IP
最近有一个问题进行系统性能优化的时候来到。解析分享给大家后,。
我们socket当建立连接,假设我们不能将计算机连接到指定的站点,那么这将导致系统卡socket的connect在此方法。
我们都知道socket它需要三次握手建立连接。计算机server发送消息头,server返回。这时候socket基本连接成功。可是假设连接
不上的话这里会卡一个Timeout的时间。时间一到,方法返回失败,socket默认的timeout好像是20秒,
我们系统如今有一个从可用的ip列表里面检測出一个可用的ip,拿出来作为可用数据保存到内存。
之前我们是串行測试,一个不可用再去尝试下一个,这个操作将业务流程停止在这一步非常长时间。
如今改成并行測试,开启多个线程測试,有可用的ip之后直接返回。这个检測操作的时间缩减到毫秒级。大大提升了系统性能。
详细代码例如以下:
资源接口:
package com.sunyard.frame.resource.base; /**
* 可初始化的资源
*
* @author zhangWei
* @since 2014年10月29日 下午6:58:55
* @version zhw_1.1
*/
public abstract class InitAble { /**
* 初始化
* @return true 初始化成功
*/
public abstract boolean init(); /**
* 销毁该资源,如关闭连接等
*/
public abstract void destory(); }
探測器:
package com.sunyard.frame.resource; import java.util.List; import com.sunyard.frame.resource.base.InitAble;
import com.sunyard.frame.thread.ThreadPool;
import com.sunyard.frame.utils.ListUtils; /**
* 资源探測器,从一组资源中检測出一个可用的资源
*
* @author zhangWei
* @since 2014年10月29日 下午7:00:45
* @version zhw_1.1
*/
public class ResourceDetector { /**待检測的资源*/
private List<? extends InitAble> resources; /**创建该对象的线程*/
private Thread mainThread; /**探測结果*/
private InitAble result; /**用于并发探測可用资源的线程池。能够用java的ExecutorService取代*/
private ThreadPool pool = new ThreadPool(10); /**探測失败的记录数*/
private Integer failCount = 0; public ResourceDetector(List<? extends InitAble> resources) {
super();
this.resources = resources;
this.mainThread = Thread.currentThread();
} /**
* 探測器開始探測可用的资源
*
* @author zhangWei
* @since 2014年10月29日 下午7:20:21
*/
public InitAble detect(){
if(ListUtils.isNotEmpty(resources)){
for(InitAble i:resources){
pool.execute(createDetectTask(i));
}
synchronized (mainThread) {
try {
mainThread.wait();
} catch (InterruptedException e) {
}
}
return result;
} else {
return null;
}
} /**创建探測一个资源的子线程*/
private Runnable createDetectTask(final InitAble i){
return new Runnable() {
@Override
public void run() {
try{ if(i.init()){
result = i;
synchronized (mainThread) {
mainThread.notify();
}
} else {
synchronized (failCount) {
if(++failCount == resources.size()){
synchronized (mainThread) {
mainThread.notify();
}
}
}
}
} finally {
i.destory();
}
}
};
} }
測试类:
这里的 SocketDecorate是 InitAble的子类。ServerSocketProxy是启动一个服务端监听,大家能够自行实现。代码太多就不复制上去了
package test.resource; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import test.socket.ServerServiceImpl;
import junit.framework.TestCase; import com.sunyard.frame.resource.ResourceDetector;
import com.sunyard.frame.socket.client.SocketDecorate;
import com.sunyard.frame.socket.server.ServerSocketProxy; public class TestResource extends TestCase { public void testDetect(){
//创建一个ServerSocket
ServerSocketProxy ss;
try {
ss = new ServerSocketProxy(1000, ServerServiceImpl.class, true);
ss.startServer();
} catch (IOException e) {
} SocketDecorate d1 = new SocketDecorate("168.1.1.1", 1000);
SocketDecorate d2 = new SocketDecorate("168.1.1.2", 1000);
SocketDecorate d3 = new SocketDecorate("168.1.1.3", 1000);
SocketDecorate d4 = new SocketDecorate("168.1.1.4", 1000);
SocketDecorate d5 = new SocketDecorate("168.1.1.5", 1000);
SocketDecorate d6 = new SocketDecorate("168.1.1.6", 1000);
SocketDecorate d7 = new SocketDecorate("168.1.1.7", 1000);
SocketDecorate d8 = new SocketDecorate("127.0.0.1", 1000);
List<SocketDecorate> resources = new ArrayList<SocketDecorate>();
resources.add(d1);
resources.add(d2);
resources.add(d3);
resources.add(d4);
resources.add(d5);
resources.add(d6);
resources.add(d7);
resources.add(d8);
ResourceDetector detector = new ResourceDetector(resources);
SocketDecorate s = (SocketDecorate) detector.detect();
System.out.println(s);
} }
版权声明:本文博主原创文章,博客,未经同意不得转载。
java多线程检测可用IP的更多相关文章
- Java 多线程 高可用原则
高可用原则 1 降级 降级开关的设计思路如下: 1. 集中管理开关:把开关推送到各个应用. 2. 可降级的多级读服务:比如服务调用降级为只读本地缓存.只读分布式缓存.只读默认降级数据(如库存状态默认有 ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- java 检测代理IP是否准确
我这里提供2个方法都可以实现:第一个是createIPAddress()和convertStreamToString() import java.io.IOException; import java ...
- 从JAVA多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...
- 关于java多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题, 另外关于java多线程的知识也是非常的多,本文中先介绍和说明一 ...
- java多线程(精华版)
在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应 ...
- 50个Java多线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...
- Java多线程与并发面试题
1,什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一 ...
- Java多线程面试题整理
部分一:多线程部分: 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. ...
随机推荐
- Java 8 时间日期库的20个使用示例
java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之, ...
- SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...
- linux下安装oracle11g 64位最简客户端(转)
安装环境 Linux服务器:SuSe11 sp1 64位 Oracle客户端:Oracle11gR2 64位(最简客户端) 部署流程 1.准备工作,首先在oracle官网下载最新的 ...
- unicode下一个,读取数据库乱码问题
TCHAR cbContent[512]; dyn.GetFieldValue(0,cbContent,512); // 中文会显示乱码 AfxMessageBox(cbConte ...
- Linux中查看socket状态(转)
Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...
- hdu4190 简单的二分法
题意是 有n个城市,m个投票箱.接下来n个城市人口数,每一个投票箱都不能为空.计算最后投票箱的容量必须达到多少,才干满足须要. 每一个城市的人必须仅仅能将票投到自己城市分得得投票箱中.要是容量最小箱子 ...
- Java中Integer类的方法
java.lang 类 Integer java.lang.Object java.lang.Number java.lang.Integer 全部已实现的接口: Serializable, Comp ...
- Linux鸟哥的私房菜(3)— 总体规划和磁盘分区 读书笔记
1.每个硬件设备Linux中的文件名称 在Linux系统中.每一个设备都被当成一个文件来对待.而且差点儿全部的硬件设备文件都在/dev文件夹下 常见设备与其对于文件名称 2.磁盘连接的方式与设备文件名 ...
- 玩转Web之Jsp(一)-----jsp中的静态包含(<%@include file="url"%>)与动态包含(<jsp:include>)
在jsp中include有两种形式,其中<%@include file="url"%>是指令元素,<jsp:include page="" f ...
- SVM算法实现(一)
关键字(keywords):SVM 支持向量机 SMO算法 实现 机器学习 假设对SVM原理不是非常懂的,能够先看一下入门的视频,对帮助理解非常实用的,然后再深入一点能够看看这几篇入门文章,作者写得挺 ...