我想同时执行五次cmd命令。所以我创建了一个线程来驱逐命令并启动线程五次。这是对的吗?
MyRunnable r1 = new MyRunnable();
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
executor.execute(r1);
}
.......
@Override
public void run()
{
try {
// Execute command
String command = "cmd /c start cmd.exe";
Process child = Runtime.getRuntime().exec(command);
// Get output stream to write from it
OutputStream out = child.getOutputStream();
out.write("cd C:/ /r/n".getBytes());
out.flush();
out.write("dir /r/n".getBytes());
out.close();
} catch (IOException e)
{
}
}
答案 0 :(得分:0)
我不太明白,你的意思是你的问题中的“正确”。
如果您问,此代码是否有效?然后回答是肯定的。
这段代码可能会导致一些问题吗?然后答案也是肯定的。
如果您的runnable对象有一些共同状态(某些类级别字段),它们可能会被破坏,因为多个线程将能够修改它。
如果你的runnable是无状态的并且它的所有变量都是在方法范围内声明的,那么一切都可以,直到有一天有人会添加一个类级变量......并且可能会得到一个非常奇怪的应用程序行为甚至更糟 - 一些生产错误,很难找到和调试。要防止出现这种情况,您必须为您启动的每个线程创建一个新的可运行类实例。
答案 1 :(得分:0)
而不是使用,MyRunnable r1 = new MyRunnable(); 使用Runnable r1 = new MyRunnable();
要执行该线程,我们可以使用execute()方法或submit()。 你的代码看起来不错。
确保ExecutorService已关闭。要关闭ExecutorService,可以使用shutdown()\ shutdownNow()。 另外,可以使用awaitTermination()以等待所有线程终止。