文档章节

这段代码会让我机器没有任何反应,待查原因

若水191
 若水191
发布于 2017/08/30 15:29
字数 491
阅读 111
收藏 0
点赞 0
评论 13

//扫描内网ip的主类

package cn.coders.pi;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

import cn.coders.net.application.pool.CnCodersThreadPool;
import cn.coders.spider.pool.ReptiliaThreadPool;


public class ScanNetWorkIp {
    private static List<DeviceInfo> devices;

    public static CnCodersThreadPool pool;

    private int threadNum = 20;
    private AtomicInteger threadAlive = new AtomicInteger();

    private ReentrantLock reentrantLock = new ReentrantLock();

    private Condition condition = reentrantLock.newCondition();
    static {
        pool = new CnCodersThreadPool();
    }


    public ScanNetWorkIp() {
        devices = new ArrayList<DeviceInfo>();
        pool.corePoolSize = 10;
        threadNum = pool.maximumPoolSize;
    }


    public static void stoppool() {
        pool.shutdown();
    }


    public static void PushIp(DeviceInfo dev) {
        devices.add(dev);
    }


    public void search() throws UnknownHostException, InterruptedException {
        InetAddress host = InetAddress.getLocalHost();
        String hostName = host.getHostName();
        String hostAddress = host.getHostAddress();
        System.out.println(hostName + ":" + hostAddress);
        int k = 0;
        k = hostAddress.lastIndexOf(".");
        String ss = hostAddress.substring(0, k + 1);
        for (int i = 1; i < 255; i++) { // 对所有局域网Ip
            if (threadAlive.get() >= threadNum) {
                try {
                    reentrantLock.lock();
                    while (threadAlive.get() >= threadNum) {
                        try {
                            condition.await();
                        }
                        catch (InterruptedException e) {
                        }
                        finally {
                            reentrantLock.unlock();
                        }
                    }
                }
                finally {
                    if (reentrantLock.isLocked())
                        reentrantLock.unlock();
                }
            }
            threadAlive.incrementAndGet();
            final Runnable commands = new PingIP(ss + i);
            pool.execute(new Runnable() {
                @SuppressWarnings("finally")
                [@Override](https://my.oschina.net/u/1162528)
                public void run() {
                    try {
                        commands.run();
                    }
                    finally {
                        try {
                            reentrantLock.lock();
                            threadAlive.decrementAndGet();
                            condition.signal();
                        }
                        finally {
                            reentrantLock.unlock();
                        }
                    }
                }
            });
        }

    }


    public static void main(String[] args) {
        ScanNetWorkIp scannet = new ScanNetWorkIp();
        try {

            scannet.search();
            scannet.stoppool();
            System.out.println(scannet.getDevices());

        }
        catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public List<DeviceInfo> getDevices() {
        return devices;
    }


    public void setDevices(List<DeviceInfo> devices) {
        this.devices = devices;
    }
}

DeviceInfo 类

package cn.coders.pi;

class DeviceInfo {
    private String name;
    private String ip;
    public DeviceInfo(String name, String ip) {
        this.name = name;
        this.ip = ip;
    }
}

PingIP 探测ip是否存在的类。

package cn.coders.pi;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;

import cn.coders.net.application.utils.CnCoderUtils;


class PingIP implements Runnable {
    private String ip;


    public PingIP(String ip) {
        this.ip = ip;
    }


    public void run() {
        try {
            String ping = "ping -n 1 -w 5 " + ip;

            Process process = Runtime.getRuntime().exec(ping);
            InputStreamReader inputStream = new InputStreamReader(process.getInputStream(), "GBK");
            BufferedReader reader = new BufferedReader(inputStream);
            StringBuffer buf = new StringBuffer();
            String s;
            while ((s = reader.readLine()) != null) {
                buf.append(s + "\n");
            }
            if (buf.toString().indexOf("请求超时") != -1) {

            }
            else {
                InetAddress host = InetAddress.getByName(ip);
                String hostName = host.getHostName();
                DeviceInfo deviceInfo = new DeviceInfo(hostName, ip);
                ScanNetWorkIp.PushIp(deviceInfo);
                System.out.println(hostName + ":" + ip);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//线程池


public class CnCodersThreadPool extends ThreadPoolExecutor {
	public CnCodersThreadPool(int corePoolSize, int maximumPoolSize,
			long keepAliveTime, TimeUnit unit,
			BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
		super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
				threadFactory);
	}

	public static BlockingQueue<Runnable> reptiliaWorkQueue = new LinkedBlockingQueue();
	public static int corePoolSize;
	public static int maximumPoolSize;
	public static long keepAliveTime;
	static {
		int core = SysConfigContent.getIntegerProperty("core_pool_size");
		if (core > 0)
			corePoolSize = core;
		else
			corePoolSize = 40;
		int max = SysConfigContent.getIntegerProperty("maximum_pool_size");
		if (max > 0)
			maximumPoolSize = max;
		else
			maximumPoolSize = 500;
		long keepTime = SysConfigContent.getLongProperty("keep_alive_time");
		if (keepTime > 0)
			keepAliveTime = keepTime;
		else
			keepAliveTime = 5000;
	}

	public CnCodersThreadPool() {
		super(corePoolSize, maximumPoolSize, keepAliveTime,
				TimeUnit.MILLISECONDS, reptiliaWorkQueue);
	}

	@Override
	public void execute(Runnable command) {
		super.execute(command);
	}

	@Override
	protected void afterExecute(Runnable r, Throwable t) {
		return;
	}

}



© 著作权归作者所有

共有 人打赏支持
若水191
粉丝 2
博文 4
码字总数 1448
作品 0
程序员
加载中

评论(13)

我今年大三
我今年大三

引用来自“若水191”的评论

引用来自“我今年大三”的评论

这代码。。写了一堆锁 就是为了限制线程数? 没话说了 使用newFixedThreadPool - - 完美运行 没毛病。。
你见过10秒钟之后,线程池队列需要几万的队列么?

回复@若水191 : 首先 线程池队列几万和几万线程是有区别的。其次如果需要,1个线程就可以把机子跑死? 再然后跟你说下core_pool_size 参数,这个并不是线程的最大数,只是一个起始值。如果使用默认值 最大线程数应该是500。
若水191
若水191

引用来自“我今年大三”的评论

这代码。。写了一堆锁 就是为了限制线程数? 没话说了 使用newFixedThreadPool - - 完美运行 没毛病。。
你知道系统最大能启动多少个线程么?
若水191
若水191

引用来自“我今年大三”的评论

这代码。。写了一堆锁 就是为了限制线程数? 没话说了 使用newFixedThreadPool - - 完美运行 没毛病。。
你见过10秒钟之后,线程池队列需要几万的队列么?
若水191
若水191

引用来自“我今年大三”的评论

core_pool_size maximum_pool_size keep_alive_time 这些你配置了吗。。

引用来自“若水191”的评论

没看源码么,没有的话会自动配置的

引用来自“我今年大三”的评论

对。。就是这个默认配置有点凶了? core_pool_size 起手就是20。。。maximum_pool_size 500? 我觉得这个和你机子卡有直接关系。。
才20个并发,而且我改了,改成10个了
我今年大三
我今年大三

引用来自“我今年大三”的评论

core_pool_size maximum_pool_size keep_alive_time 这些你配置了吗。。

引用来自“若水191”的评论

没看源码么,没有的话会自动配置的
对。。就是这个默认配置有点凶了? core_pool_size 起手就是20。。。maximum_pool_size 500? 我觉得这个和你机子卡有直接关系。。
我今年大三
我今年大三
这代码。。写了一堆锁 就是为了限制线程数? 没话说了 使用newFixedThreadPool - - 完美运行 没毛病。。
若水191
若水191

引用来自“我今年大三”的评论

core_pool_size maximum_pool_size keep_alive_time 这些你配置了吗。。
没看源码么,没有的话会自动配置的
我今年大三
我今年大三
core_pool_size maximum_pool_size keep_alive_time 这些你配置了吗。。
若水191
若水191

引用来自“我今年大三”的评论

- -我这没问题。。。只改了下线程池类型。和去了 run方法的注解。。

引用来自“若水191”的评论

好无语啊,我这里就直接卡死了,机器只能重启……

引用来自“我今年大三”的评论

线程池代码贴出来看看。。
贴上了,就是ThreadPoolExecutor的一次再封装而已
我今年大三
我今年大三

引用来自“我今年大三”的评论

- -我这没问题。。。只改了下线程池类型。和去了 run方法的注解。。

引用来自“若水191”的评论

好无语啊,我这里就直接卡死了,机器只能重启……
线程池代码贴出来看看。。
为什么我离不开 Linux?

本文是为那些想要尝试Linux的用户所写,不过如果你已经是一名Linuxer,这里也有一些你应该知道并为之自豪的事实。全世界的开发人员用宝贵的时间和天才的头脑为你带来这一款“谁与争锋”的操作...

oschina
2013/11/04
8.2K
101
关于OpenCart 后台(Dashboard)首页打开很慢的问题_已迁移

很久没有搞OpenCart了,昨天在群里面看到一个人反应,OpenCart 后台(Dashboard)首页打开很慢,大约9秒,其他任何页面都很快。不知道什么原因,于是我帮他解决了这个问题,这里随便记录一下...

辣条拌鱼翅
2015/06/06
0
0
程序员/开发者的时间都去哪了?

对于那些不知道程序员/开发者的时间都去哪了的人,本文可能会提供一些线索。我记录了这份日志不仅是为了看看时间都花费在哪了,也是为了看看我都做了些什么,检视下自己是否偷懒了。当回顾之...

oschina
2014/03/26
5.9K
21
JQuery $("#form").ajaxsubmit没有反应。。。

在VS2013中用C#代码编写了一个页面,想用JQuery的Ajaxsumbit提交图片文件,结果没有任何反应。图片文件上传到根目录的upload/photo文件夹。 运行程序时,首页中这段代码没有任何反应: func...

云o浩
2016/04/03
1K
2
Json字符串转复杂对象

最近的项目中和第三方接口联调,需要调用webservice接口获取json格式字符串,然后转化成对象。 在此记录一下遇到的问题。 1.Stirng字符串问题,第一个字符为空,不是"{" 前期开发过程中,第三...

_小_波_
2016/01/12
116
1
使用 D8 分析 javascript 如何被 V8 引擎优化的

在上一篇文章中我们讲了如何使用 GN 编译 V8 源码,文章最后编译完成的可执行文件并不是 V8,而是 D8。这篇我们讲一下如何使用 D8 调试 javascript 代码。 如果没有 d8,可以使用 node 代替。...

justjavac
2017/02/08
0
0
【OSC手机App技术解析】- 集成新浪微博Android SDK

@迷途d书童 你好,想跟你请教个问题:我按照您的方法实现新浪微博的隐式认证,为什么会在 weibo.authorize(AuthorizeActivity.this, new WeiboDialogListener() { 没有任何反应呢?没报错、没...

把握今天hxl
2012/08/04
358
1
OSC 服务器硬件故障的判断?

昨天中午 OSC 佛山 CDN 节点的服务器挂掉了,这个现象是今天早晨无法连接佛山服务器,找机房的人重启的时候发现的。接上显示器后重启完全没有任何显示,但网卡灯是亮的。 这也就是为什么昨天...

红薯
2013/12/28
2K
40
How do I get started in machine learning

:“How do I get started in machine leraning?” 我是一个开发人员。我已经读过机器学习方面的一些书或文章。我在Coursera中学习过机器学习课程。但我仍然不知道如何开始… 这听起来是不是很...

东方神剑
2015/09/29
131
0
HBase优化实战

调优 首先根据目前17台机器,50000+的QPS,并且观察磁盘的I/O利用率和CPU利用率都相当低来判断:当前的请求数量根本没有达到系统的性能瓶颈,不需要新增机器来提高性能。如果不是硬件资源问题...

LostTimes
2015/12/07
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
32分钟前
13
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
34分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
48分钟前
6
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部