0

この Java コードを実行しようとしていますが、正しく動作しません。

私が間違っていることを教えてください。

for ループの i が 10 未満です。i が 1 未満 (ループがないことを意味する) の場合、プログラムは正常に動作しますが、(i が n 未満) の場合、n が 1 より大きい場合、例外がスローされます。

public class Main {

    public static void main(String[] args) {
        final Semaphore sem = new Semaphore(1, true);
        Thread t1 = new Thread("TA") {
            public void run() {
                try {
                    sem.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("A");
                sem.release();
            }
        };
        Thread t2 = new Thread("TB") {
            public void run() {
                try {
                    sem.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("B");
                sem.release();
            }
        };
        Thread t3 = new Thread("TC") {
            public void run() {
                try {
                    sem.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("C");
                sem.release();
            }
        };

        for (int i = 0; i < 10; i++) {
            t1.start();
            t3.start();
            t2.start();
        }

    }
}
4

1 に答える 1

1

スレッドを複数回開始することはできません。したがって、2番目のループ中に、2回目の呼び出し時に例外が発生しますt1.start()。これはjavadocに記載されています:

スレッドを複数回開始することは決して合法ではありません。特に、実行が完了したスレッドは再起動されない場合があります。

スロー:IllegalThreadStateException-スレッドがすでに開始されている場合。

スレッドを直接操作する代わりに、ExecutorServiceを使用できます。次のようになります。

public static void main(String[] args) throws Exception {
    ExecutorService executor = Executors.newFixedThreadPool(3);
    final Semaphore sem = new Semaphore(1, true);
    Runnable r1 = new Runnable() {
        public void run() {
            try {
                sem.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("A");
            sem.release();
        }
    };
    Runnable r2 = new Runnable() {
        public void run() {
            try {
                sem.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("B");
            sem.release();
        }
    };
    Runnable r3 = new Runnable() {
        public void run() {
            try {
                sem.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("C");
            sem.release();
        }
    };

    for (int i = 0; i < 10; i++) {
        executor.submit(r1);
        executor.submit(r2);
        executor.submit(r3);
    }

    executor.shutdown();
}
于 2012-12-17T23:27:45.420 に答える