并行执行java中的多个线程

use*_*810 3 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(){
            .........
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Cha*_*the 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(); });
}
Run Code Online (Sandbox Code Playgroud)