这段代码会让我机器没有任何反应,待查原因
这段代码会让我机器没有任何反应,待查原因
若水191 发表于8个月前
这段代码会让我机器没有任何反应,待查原因
  • 发表于 8个月前
  • 阅读 111
  • 收藏 0
  • 点赞 0
  • 评论 13

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 记录于此,等待查找原因

//扫描内网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;
	}

}



标签: 死锁
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 4
码字总数 1448
评论 (13)
若水191
有人么,能帮忙看下么,不敢跑了
我今年大三
- -我这没问题。。。只改了下线程池类型。和去了 run方法的注解。。
若水191

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

- -我这没问题。。。只改了下线程池类型。和去了 run方法的注解。。
好无语啊,我这里就直接卡死了,机器只能重启……
我今年大三

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

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

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

好无语啊,我这里就直接卡死了,机器只能重启……
线程池代码贴出来看看。。
若水191

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

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

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

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

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

线程池代码贴出来看看。。
贴上了,就是ThreadPoolExecutor的一次再封装而已
我今年大三
core_pool_size maximum_pool_size keep_alive_time 这些你配置了吗。。
若水191

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

core_pool_size maximum_pool_size keep_alive_time 这些你配置了吗。。
没看源码么,没有的话会自动配置的
我今年大三
这代码。。写了一堆锁 就是为了限制线程数? 没话说了 使用newFixedThreadPool - - 完美运行 没毛病。。
我今年大三

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

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

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

没看源码么,没有的话会自动配置的
对。。就是这个默认配置有点凶了? core_pool_size 起手就是20。。。maximum_pool_size 500? 我觉得这个和你机子卡有直接关系。。
若水191

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

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

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

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

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

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

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

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

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

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

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

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

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

回复@若水191 : 首先 线程池队列几万和几万线程是有区别的。其次如果需要,1个线程就可以把机子跑死? 再然后跟你说下core_pool_size 参数,这个并不是线程的最大数,只是一个起始值。如果使用默认值 最大线程数应该是500。
×
若水191
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: