-6

Threadのサブクラスを作成し、メインクラスから2つのThreadオブジェクトを作成、初期化、および開始することにより、マルチスレッドプログラムを作成します。スレッドは、適切なインターフェイスで次の出力を実行します。

出力:
thread1:java
thread1:is
thread2:Java
thread1:
thread2:is
thread1:エキサイティングな
thread2:
thread1:新しい
thread2:エキサイティングな
thread1:言語
thread1:for
thread1:同時
スレッド2:新しい
thread1:プログラミング。
thread2:言語
thread2:for
thread2:並行
thread2:プログラミング。

これは私のコーディングが最初にスレッド1を呼び出し、次にスレッド2を呼び出すようです。その出力のように表示する方法。

class Thread1 extends Thread {

    public void run() {
        System.out.println("Thread1: Java");
        System.out.println("Thread1: is ");
        System.out.println("Thread1: exciting ");
        System.out.println("Thread1: new ");
        System.out.println("Thread1: language ");
        System.out.println("Thread1: for ");
        System.out.println("Thread1: concurrent ");
        System.out.println("Thread1: programming ");

    }
}

class Thread2 extends Thread {

    public void run() {
        System.out.println("Thread2 Java");
        System.out.println("Thread2: an ");
        System.out.println("Thread2: is ");
        System.out.println("Thread2: an ");
        System.out.println("Thread2: exciting");
        System.out.println("Thread2: new");
        System.out.println("Thread2: language");
        System.out.println("Thread2: for");
        System.out.println("Thread2: concurrent");
        System.out.println("Thread2: programming");
        suspend();
    }
}
class Thread3 extends Thread
{
public void run()
{
System.out.print("Thread3");
try
        {
sleep(1000);
}
catch(Exception e)
{
}

System.out.print(" Running");
}
}

class ThreadDemo3
{
public static void main(String args[]) throws InterruptedException
{
Thread1 obj1 = new Thread1();
obj1.start();
Thread2 obj2 = new Thread2();
obj2.start();

}
}
4

2 に答える 2

1

目的の結果が得られるまで実行します。

これは、スレッドが特定の順序で実行されないことを示す典型的な例です。

したがって、プログラムの出力は、実行するたびに異なるはずです (予測できません)。しかし、あなたはまさにそれをやろうとします。

解決策の 1 つは、他のスレッドがジョブを実行する必要があるときに取得して解放するロック ( synchronizedを参照) を使用することです (スレッドがすぐにロックを再取得するのを防ぐために、ある種の待機を追加することを忘れないでください) が、これは逆効果です。ここ。

ちなみに、宿題をSOにコピーしたようです。

編集:新しいスレッドが開始されたときに最初のスレッドがまだ終了していない古いマシンを取得します。

実際、コマンドが実行される順序を予測することは、ルーレットをするようなものです。あなたはそれを試すことができますが、最後には負けます。

于 2013-03-05T15:29:09.057 に答える
0

この狂気を行うための厄介な方法はありません。ガンポイントでそれを強制された場合、おそらく各スレッドにスイッチ/ケースステートマシンを実行させ、スレッドスワップオーバーが必要な場合は、セマフォを他のスレッドに通知し、別のセマフォがその状態になるのを待ちます-信号を返すマシン。

于 2013-03-05T15:34:29.007 に答える