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) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. ...
随机推荐
- ubuntu 12.04安装经典的Gnome桌面
这次介绍的是如何在ubuntu 12.04 中安装经典的 GNOME桌面,默认的 Ubuntu 12.04 默认unity桌面,一些用户不喜欢 Unity 桌面,所以想找回昔日的经典Gnome桌面. ...
- Linux在高铁项目的部署环境
因为Linux和Java像开源.所以,现在在server基本上使用部署Linux平台即server.然后部署项目.在开发项目的过程中.程序员绝大多数仍采用最经典windows操作系统,尽管Linux也 ...
- ALSA安装编程指南
ALSA全指南 一.什么是ALSA ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Mu ...
- 004串重量 (keep it up)
设计算法并写出代码移除字符串中反复的字符,不能使用额外的缓存空间. 注意: 能够使用额外的一个或两个变量,但不同意额外再开一个数组拷贝. 简单题直接上代码: #include <stdio.h& ...
- Kafka设计
[Apache Kafka]Kafka设计 在开始开发producer和consumer之前,先从设计的角度看一看Kafka. 由于重度依赖JMS,且实现方式各异.对可伸缩架构的支持不够,Link ...
- CAS实现SSO单点登录原理(转)
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- web项目启动,运行方法
1.显示器(Listener) web文件加入 <listener> <listener-class>cn.ro.common.InitListener</li ...
- c++日历改进版
#include<iostream> # include<fstream> #include<time.h> #include<string> #inc ...
- LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_ocl249.lib”
最近想要编译什么OpenCV资源.查看源代码调试执行. 按照网上的文章<Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV> 进行配 ...
- PHP关联数组和哈希表(hash table) 未指定
PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...