12

3 つのスレッドを順番に実行するにはどうすればよいでしょうか? たとえば。スレッド 1、スレッド 2、スレッド 3。あるスレッドの参照を別のスレッドに渡し、run() メソッドから呼び出すことはできません。

したがって、コードは次のようになります。

 Thread1.start();
 Thread2.start();
 Thread3.start();

そしてアウトプットは

 Printing Thread1
 Printing Thread2
 Printing Thread3

これは ThreadPoolExecutor を使用し、ブロッキング キューを使用することで可能になりますが、それでも受け入れられる答えではありません。

4

13 に答える 13

16

Executors.newSingleThreadExecutor()を使用できますが、厳密に言えば、これは1 Threadつしか起動しないため、期待される解決策ではない可能性があります。

クラスだけを使用した最も簡単なソリューションThread

Thread1.start();
Thread1.join();
Thread2.start();
Thread2.join();
Thread3.start();
Thread3.join();

(わかりやすくするために例外処理を省略しました。Thread.join()スローできますInterruptedException

于 2011-03-28T15:54:27.313 に答える
11

最も簡単な答えは

Thread1.run();
Thread2.run();
Thread3.run();

非現実的な質問の問題は、多くの場合、有益でない答えがあることです。;)

スレッドを持つことの全体的なポイントは、それらを同時に実行することです。それをまったく行っていない場合は、スレッドを使用しないでください。

あなたはそれを言うかもしれません。run()メソッドを呼び出すことはできません。この場合、run()メソッドを呼び出すため、ThreadPoolExecutorを使用できません。つまり、submit()が最終的に行うことです。

編集:スレッドが含まれているという事実は無関係であるため、結果は完全に決定論的です。

static class PrintThread extends Thread {
    public PrintThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++)
            System.out.println(getName() + ": " + i);
    }
}

public static void main(String args[]) {
    Thread thread1 = new PrintThread("A");
    Thread thread2 = new PrintThread("B");
    Thread thread3 = new PrintThread("C");

    thread1.run();
    thread2.run();
    thread3.run();
}

プリント

A: 0
A: 1
.. deleted ..
C: 98
C: 99

予想通り。

于 2011-03-28T15:48:15.217 に答える
11

java.util.concurrentパッケージでExecutorServiceを使用します。より正確に使用するExecutors.newSingleThreadExecutor();

于 2011-03-28T15:49:00.990 に答える
5

ExecutorService を使用すると、スレッドを順次実行できます。以下の例を見つけてください。

public class SeqThread {

    public static void main(String[] arg) {
          new SeqThread().execute();
    }

    public void execute() {
        try {
        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.submit(R);
        executor.submit(R2);
        executor.shutdown();

            executor.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    Runnable R = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for(int i=0;i<10;i++)
            {
                System.out.println("In Thread One "+i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    };

    Runnable R2 = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for(int i=0;i<10;i++)
            {
                System.out.println("In Thread Two="+i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    };
}
于 2013-08-05T12:28:19.587 に答える
5

これはインタビューの質問であるため、彼らは特定の知識を求めています。また、彼らは自分が望む答えが得られるまで、解決策を次から次へと試していく可能性が高いようです。

おそらく彼らは、スレッド間通信を自分で実装できるかどうかを知りたがっています。しかし、彼らはあなたにそれを簡単な方法で行うことを望んでいません (スレッド参照が利用可能です)。それ以外の場合は、単に行うことができますthread.join()

そのため、3 つのスレッドすべてで共有メモリ (同期された静的クラス) を取得します。各スレッドにpublic static int nextThread(). それらが次のスレッドであるという比較が成功すると、それらは作業を行い、public static setNextThread(int value)処理される次のスレッドの値で更新する必要があります。

重要なのは、これをスレッドセーフな方法で行うことです。ただし、一意のスレッド ID を保証し、2 つのスレッドが同じ ID を持たないようにすることができれば、(慎重にコーディングすれば) 同期せずにこれを行うこともできます。

于 2011-03-28T16:08:59.087 に答える
4

これらのスレッドを呼び出すさまざまな方法に関連していない場合、理論的には、共通の sempahoreを取得し、印刷が完了したら解放する必要があります。
JDK にはセマフォが組み込まれています。

于 2011-03-28T16:13:12.047 に答える
1

そこにすべてを見つけることができます:http://download.oracle.com/javase/tutorial/essential/concurrency/index.html

特に、通知とスレッド間の同期について読んでください。

PSそして、面接に合格したとしても、それでも仕事をしなければならなかったことを忘れないでください!:)

(わかりました、いくつかのヒントを示します。そのようなメソッドの説明を見てください。Object.wait()これObject.notifyAll()は最も単純ですが、非常に便利なメカニズムでもあります)

于 2011-03-28T15:47:55.780 に答える
1

newSingleThreadExecutor。シングルスレッドのエグゼキューターは、タスクを処理する単一のワーカー スレッドを作成し、予期せず終了した場合はそれを置き換えます。タスクは、タスク キューによって課された順序 (FIFO、LIFO、優先順位) に従って順次処理されることが保証されます。

于 2011-08-07T16:44:12.233 に答える
0

これはひっかけ問題かもしれません。おそらく、彼らはこの特定の問題の解決策を聞きたくないのですが、問題の原因を突き止めて、より良い解決策を考え出すことを望んでいます.

于 2011-03-28T17:05:40.563 に答える
-4
public static void main(String[] args)throws InterruptedException {

    MyRunnable r = new MyRunnable();
    Thread t1 = new Thread(r,"A");
    Thread t2 = new Thread(r,"B");
    Thread t3 = new Thread(r,"C");
    t1.start();
    Thread.sleep(1000);
    t2.start();
    Thread.sleep(1000);
    t3.start();



}
于 2012-12-09T11:31:12.510 に答える