0

2 つのスレッドを並行して実行する必要があります。

1) 1 から 100 までの素数を計算する PrimeThread。2) 1 から 100 までの偶数を計算する evenThread。

素数と偶数のロジックを実装しました。それに集中しないでください。私の質問は、

次の方法で数字を印刷したい。10個の素数 10個の偶数 10個の素数 10個の偶数とそれらの残り。

それは可能ですか?

sleep() メソッドを使用しましたが、機能しません。私を助けてください。ありがとう。

4

4 に答える 4

1

2 つのスレッドを並行して実行する必要があります。
[...]
次の方法で数字を印刷したい。10個の素数 10個の偶数 10個の素数 10個の偶数とそれらの残り。

これは矛盾しているように思えます: あなたが望む出力は、あなたが本当に望むのは、タスクを順番に実行することですが、インターリーブされた方法で実行することです. printNextPrimes(int number)2 つのメソッドを作成printNextEvens(int number)して、それらを 1 つのスレッド ループで呼び出してみませんか。

for (int i = 0; i < 10; i++) {
    printNextPrimes(10);
    printNextEvens(10);
}
于 2012-11-17T10:23:57.513 に答える
0

このようなもの:

public class Test {
    static Object lock = new Object();
    static boolean printPrime = true;
    static boolean printEven;

    static class PrimeTread extends Thread {
        public void run() {
            int n = 0;
            while (n < 100) {
                synchronized (lock) {
                    if (printPrime) {
                        for (int i = 0; i < 10; i++) {
                            System.out.println(nextPrime());
                            n++;
                        }
                        printPrime = false;
                        printEven = true;
                        lock.notifyAll();
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }

        private int nextPrime() {
            return 31;
        }
    }

    static class EvenTread extends Thread {
        public void run() {
            int n = 0;
            while (n < 100) {
                synchronized (lock) {
                    if (printEven) {
                        for (int i = 0; i < 10; i++) {
                            System.out.println(nextEven());
                            n++;
                        }
                        printPrime = true;
                        printEven = false;
                        lock.notifyAll();
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }

        private int nextEven() {
            return 2;
        }
    }

    public static void main(String[] args) {
        new EvenTread().start();
        new PrimeTread().start();
    }
}
于 2012-11-17T08:10:07.303 に答える
0

この例を見てください。同期方法でスレッドを使用する方法を示しています...

これで、「A、A、A、.....B、B、B....C、C、C」と「C、B、A、B、C、A」の代わりに「C、B、A、B、C、A」を印刷します。 、B」など...

//Use of synchronize

class A
{
    char c[] = {'A', 'B', 'C'};

    synchronized void show (int index)
    {
        try
        {
            for(int i=0; i<3; i++)
            {
                System.out.println(c[index]);
                Thread.sleep(1000);
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

class B extends Thread
{
    int index;
    A ob1;

    void set (int i)
    {
        index =i;
    }

    public void run()
    {
        ob1.show(index);
    }

    public static void main (String[] args)
    {
        A ob2 = new A ();

        B b1 = new B ();
        B b2 = new B ();
        B b3 = new B ();

        b1.set(0);
        b2.set(1);
        b3.set(2);

        b1.ob1 = ob2;
        b2.ob1 = ob2;
        b3.ob1 = ob2;

        b1.start();
        b2.start();
        b3.start();
    }
}

この例があなたの質問に非常に似ているので、この例が役立つことを願っています...

于 2012-12-28T09:23:18.467 に答える
0

セマフォを探しているようです

各スレッドには独自のセマフォがあります。10 個の番号を出力した後、他のスレッドが所有していたセマフォを解放し、自身のセマフォを取得します。これにより、他のスレッドが再び開始され、そのスレッドが再び解放されるまでブロックされます。

于 2012-11-17T07:03:29.677 に答える