2
import java.util.logging.Level;
import java.util.logging.Logger;


public class test {

    private static void m1(final String a) {
        Thread t1 = new Thread(new Runnable() {

                @Override
                public void run() {
                    try {
                        Thread.sleep(1000);
                        System.out.print(a);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(test.class.getName()).log(Level.SEVERE,
                                                                   null, ex);
                    }
                }
            });
        t1.start();
    }

    private static void m2(final String a) {
        Thread t2 = new Thread(new Runnable() {

                @Override
                public void run() {
                    try {
                        Thread.sleep(1000);
                        System.out.print(" " + a);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(test.class.getName()).log(Level.SEVERE,
                                                                   null, ex);
                    }
                }
            });
        t2.start();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            m1("Mihi");
            m2("Cherub");
            System.out.println("");
        }
    }
}

MihiCherub MihiCherub 同様に 10 回出力を取得したい

しかし今、私の出力は「MihiMihi Cherub CherubMihi CherubMihiMih」です。2 つのメソッドを同期させ、結果を mihicherub として取得したいと考えています。助けてください..

4

2 に答える 2

2

動作を同期させたい場合、最善の方法は 1 つのスレッドを使用することです。

スレッドは比較的独立したタスク向けに設計されており、独立性が高いほど優れています。

同期、待機、通知を使用して必要なことを行うことができますが、比較的複雑になります (そして無意味です)。

あなたの場合、println("")他のprint()の前に実行されます。それは意図したものですか?

于 2012-09-03T07:37:09.857 に答える
0

を使用するとCountDownLatchこれを達成できますが、効率的なアプローチではありません。以下のようにコードを修正しました。

import java.util.concurrent.CountDownLatch;
import java.util.logging.Level;
import java.util.logging.Logger;

public class test {

private static void m1(final String a, final CountDownLatch sharedCountDownLatch,
        final CountDownLatch masterCountDownLatch,
        final CountDownLatch doneCountDownLatch) {
    Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                sharedCountDownLatch.countDown();
                sharedCountDownLatch.await();
                System.out.print(a);
                masterCountDownLatch.countDown();

            } catch (InterruptedException ex) {
                Logger.getLogger(test.class.getName()).log(Level.SEVERE,
                        null, ex);
            } finally {
                doneCountDownLatch.countDown();
            }
        }
    });
    t1.start();
}

private static void m2(final String a, final CountDownLatch sharedCountDownLatch,
        final CountDownLatch masterCountDownLatch,
        final CountDownLatch doneCountDownLatch) {
    Thread t2 = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                sharedCountDownLatch.countDown();
                sharedCountDownLatch.await();
                masterCountDownLatch.await();
                System.out.print(" " + a + " ");
            } catch (InterruptedException ex) {
                Logger.getLogger(test.class.getName()).log(Level.SEVERE,
                        null, ex);
            } finally {
                doneCountDownLatch.countDown();
            }
        }
    });
    t2.start();
}

public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        CountDownLatch doneCountDownLatch = new CountDownLatch(2);//CountDownLatch which will be to ensure that both threads executed.
        CountDownLatch sharedCountDownLatch = new CountDownLatch(2);//CountDownLatch that will be shared between both threads so that it will ensure that both threads are at the same execution point 
        CountDownLatch masterCountDownLatch = new CountDownLatch(1);//CountDownLatch which will be used when master thread completes it work
        m1("Mihi", sharedCountDownLatch, masterCountDownLatch,
                doneCountDownLatch);
        m2("Cherub", sharedCountDownLatch, masterCountDownLatch,
                doneCountDownLatch);
        System.out.println("");
        doneCountDownLatch.await();
    }
}
}

次のように出力します。

Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
Mihi Cherub 
于 2012-09-03T10:00:34.877 に答える