3

クラスの複数のインスタンスを同時に実行する必要があります。私は以下のコードを書きました。私はそれを2つの方法で行いました。しかし、私には違いがわかりません。スレッドを並列実行する正しい方法は何ですか?

ありがとう。

ここにスニペット:

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 つの方法の違いは、「方法 2」では、実際には複数の実行スレッドがある可能性があることです ( threadNo1 より大きいと仮定します)。方法 2 では、複数の作業スレッドが を取得し、( を呼び出すことによってRunnable)並行して (正確には同時に) 呼び出すことができます。「方法 2」の一時停止は、ほとんど何もしません。execTaskrun

「方法 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 に答える