并行执行java中的多个线程

时间:2013-11-04 15:09:29

标签: java multithreading

我必须同时执行我的类的多个实例。我在下面写了下面的代码。我是以两种方式完成的。但我没有看到差异。并行运行线程的正确方法是什么?

感谢。

这里是片段:

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(){
            .........
            }
        }
    }

1 个答案:

答案 0 :(得分:5)

两种方法之间的区别在于,在“方法2”中,您实际上可能有多个执行线程(假设threadNo大于1)。方法2允许多个工作线程同时抓取Runnable并调用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(); });
}