hendry3389 2013-02-18 16:19
浏览 102

关于Process和Thread的问题

功能描述,开启多个线程,每个线程都通过Process来调用cmd对网络进行ping,当线程执行完成后回显结果,现在的问题是,只有等全部线程中的process调用的cmd命令完成后才能进行输出,给我的感觉是当一个线程内的Process执行时,其他的线程是挂起状态。为说明这一点,我特意做了下修改,如果是ping百度的话,我要求ping5次,ping谷歌只ping1次,预想的结果是谷歌的结果很快就先显示出来,然后过一下再显示百度的结果(百度ping5次,一般需要5秒钟的时间),但现在的效果是谷歌不显示,等到百度也ping完成后同时显示,顺序不定,这时候体现出了线程抢资源的效果。

我还在api上查了一下process的资料,里面有这样一句话:“对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。”

难道有Process的对象不能进行多线程异步操作?

代码如下:

Ping类

package ping;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Ping implements Runnable {
private String name;
private String ip;

Ping() {
}

Ping(String name, String ip) {
    this.name = name;
    this.ip = ip;
}

public String getName() {
    return name;
}

public String getIp() {
    return ip;
}

public void run() {
    System.out.println(this.name + "start");
    StringBuffer buf = new StringBuffer();
    String s = "";
    Process process;
    try {
        if (this.name.compareTo("百度") == 0) {
            process = Runtime.getRuntime().exec(
                    "cmd /c ping " + this.ip + " -n 5");
        } else {
            process = Runtime.getRuntime().exec(
                    "cmd /c ping " + this.ip + " -n 1");
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(
                process.getInputStream()));
        buf.append(this.name);
        while ((s = br.readLine()) != null) {
            buf.append(s + "\n");
        }
        // process.waitFor();
        int index0 = buf.indexOf("(") + 1;
        int index1 = buf.indexOf("%");
        process.destroy();
        System.out
                .println(this.name + "\t" + buf.substring(index0, index1));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

}

测试类:

package ping;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String args[]) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/ping";
String user = "root";
String password = "123";
List list = new ArrayList();
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
Statement statement = conn.createStatement();
String sql = "SELECT * FROM hostlist";
ResultSet rs = statement.executeQuery(sql);

        while (rs.next()) {
            String name = rs.getString("name");
            String ip = rs.getString("ip");
            Ping p = new Ping(name, ip);
            list.add(p);
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    for (int i = 0; i < list.size(); i++) {
        Ping p = list.get(i);
        new Thread(p, p.getName()).start();
    }
}

}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥35 平滑拟合曲线该如何生成
    • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
    • ¥15 名为“Product”的列已属于此 DataTable
    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集