3

我必须同时执行我的类的多个实例。我在下面编写了以下代码。我已经通过两种方式做到了。但我看不出有什么区别。并行运行线程的正确方法是什么?

谢谢。

这里的片段:

public class MyClass {

        public MyClass() {
            runnable = true;
        }

        public boolean isRunnable() {
            return runnable;
        }

        public static void main(String[] args) throws InterruptedException {

            /* METHOD 1
             MyClass myclass = new MyClass();

             if (myclass.isRunnable()) {
                 for (int i = 0; i < loop; i++) {
                     myclass.execTask();      
                     Thread.sleep(sleep);
                 }
             }
             */

                  //METHOD 2
            final MyClass myclass = new MyClass();


            ExecutorService threadPool = Executors.newFixedThreadPool(threadNo);

            for (int i = 0; i < threadNo; i++) {
               threadPool.submit(new Runnable() {
                    public void run() {
                        for (int i = 0; i < loop; i++) {
                        myclass.execTask();
                            try {
                                Thread.sleep(sleep);
                            } catch (InterruptedException ex) {
                                Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                });
            }
            threadPool.shutdown();

            public void execTask(){
            .........
            }
        }
    }
4

1 回答 1

6

您的两种方法之间的区别在于,在“方法 2”中,您实际上可能有多个执行线程(假设threadNo大于 1)。方法 2 允许多个工作线程并行获取 aRunnable和调用execTask(通过调用run)(同时,准确地说)。“方法 2”中的暂停几乎没有任何作用。

“方法 1”完全在“主”线程上执行。它调用execTask,等待,然后再次调用它。这将连续多次调用执行。

(我认为这是伪代码,因为它的一部分不会编译。)

这是一个清理过的“方法2”。请注意,我有threadNo工作线程(如果它大于 1 会有所帮助)并且我创建了loop Runnables.

ExecutorService threadPool = Executors.newFixedThreadPool(threadNo);

for (int i = 0; i < loop; i++) {
    threadPool.submit(new Runnable() {
        public void run() { myclass.execTask(); });
}
于 2013-11-04T15:29:46.750 回答