同时启动一个线程5次?

时间:2015-11-02 17:49:21

标签: java multithreading executorservice

我想同时执行五次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) 
        {

        }
    }

2 个答案:

答案 0 :(得分:0)

我不太明白,你的意思是你的问题中的“正确”。

如果您问,此代码是否有效?然后回答是肯定的。

这段代码可能会导致一些问题吗?然后答案也是肯定的。

如果您的runnable对象有一些共同状态(某些类级别字段),它们可能会被破坏,因为多个线程将能够修改它。

如果你的runnable是无状态的并且它的所有变量都是在方法范围内声明的,那么一切都可以,直到有一天有人会添加一个类级变量......并且可能会得到一个非常奇怪的应用程序行为甚至更糟 - 一些生产错误,很难找到和调试。要防止出现这种情况,您必须为您启动的每个线程创建一个新的可运行类实例。

答案 1 :(得分:0)

而不是使用,MyRunnable r1 = new MyRunnable(); 使用Runnable r1 = new MyRunnable();

要执行该线程,我们可以使用execute()方法或submit()。 你的代码看起来不错。

确保ExecutorService已关闭。要关闭ExecutorService,可以使用shutdown()\ shutdownNow()。 另外,可以使用awaitTermination()以等待所有线程终止。