关于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();
    }
}

}

book_humanlixin
book_humanlixin 使用Runtime的exec方法执行得到的进程已经在运行中,使用同步关键字修饰,希望得到什么效果?
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐