java大神看过来,关于java多线程并发和定时器的问题!!!
packagenh;importjava.io.*;importjava.net.InetAddress;importjava.util.*;publicclassIp{...
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 展开
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 展开
1个回答
展开全部
threadCount 加上锁就行了 要么是大于30 死循环了 要么是小于0死循环了。大于30那边可能性比较小,小于0那边可能性比较大。
可以在这2个地方打印日志验证一下
可以在这2个地方打印日志验证一下
更多追问追答
追问
本人小白,大神synchronized不能直接修饰变量吧,会报错,加方法有用吗?还有打印日志也不会。
追答
可以专门做一个锁对象 private static Object locker =new Object(); 操作threadCount 的时候 synchronized(locker) { //threadCount 加减 }
日志sysout一下就行了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询