java大神看过来,关于java多线程并发和定时器的问题!!!

package nh;

import java.io.*;
import java.net.InetAddress;
import java.util.*;

public class Ip {
static public HashMap ping; // ping 后的结果集

public HashMap getPing() { // 用来得到ping后的结果集
return ping;
}

// 当前线程的数量, 防止过多线程摧毁电脑
static int threadCount = 0;

public Ip() {
ping = new HashMap();
}

public void Ping(String ip) throws Exception {
// 最多30个线程
while (threadCount > 30)
Thread.sleep(50);
threadCount += 1;
PingIp p = new PingIp(ip);
p.start();
}

public void PingAll() throws Exception {
// 首先得到本机的IP,得到网段
InetAddress host = InetAddress.getLocalHost();
String hostAddress = host.getHostAddress();
int k = hostAddress.lastIndexOf(".");
String ss = hostAddress.substring(0, k + 1);
for (int i = 2; i <= 10; i++) { // 对所有局域网Ip
String iip = ss + i;
Ping(iip);
}
// 等着所有Ping结束
while (threadCount > 0)
Thread.sleep(50);
}

public class PingIp extends Thread {
public String ip; // IP

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

public void run() {
Process p;
try {
p = Runtime.getRuntime().exec("ping " + ip + " -w 1000 -n 1");
InputStreamReader ir = new InputStreamReader(p.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
// 读取结果行
for (int i = 1; i < 3; i++) {
input.readLine();
}
String line = input.readLine();
if (line.indexOf("超时") > -1)
ping.put(ip, "false");
else
ping.put(ip, "true");
// 线程结束
threadCount -= 1;
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) throws Exception {
Ip ip = new Ip();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
try {
ip.PingAll();
java.util.Set entries = ping.entrySet();
Iterator iter = entries.iterator();
String k;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println(new Date()+" "+key + "-->" + value);
}
System.out.println("--------------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}, 0, 1000);
}
}
想运行代码,最好把String ss = "172.27.35.";替换原来的String ss = hostAddress.substring(0, k + 1);;反正效果是一样的。大神,在哪里???代码运行到一半运行不下去,详情见下图,急求解释!!!望大神赐教,不胜感激!!!
SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS

threadCount 加上锁就行了 要么是大于30 死循环了 要么是小于0死循环了。大于30那边可能性比较小,小于0那边可能性比较大。
可以在这2个地方打印日志验证一下追问

本人小白,大神synchronized不能直接修饰变量吧,会报错,加方法有用吗?还有打印日志也不会。

追答

    可以专门做一个锁对象 private static Object locker =new Object(); 操作threadCount 的时候 synchronized(locker) { //threadCount 加减 }

    日志sysout一下就行了

追问

谢谢大神,我试了几分钟,确实一直运行着。真是太感谢了!!!

温馨提示:答案为网友推荐,仅供参考