6

Javaでスレッドをいじっています。
Web サイトで見つけた次の例:

public class ThreadTest {

    public static void main(String args[]) {
        Thread t1 = new Thread(new Thread1());
        t1.start();

        Thread t2 = new Thread(new Thread2());
        t2.start();
    }

}

public class Thread1 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(new java.util.Date());
        }
    }

}

public class Thread2 implements Runnable {

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

}

期待される結果は次のようになります。

Mon Nov 11 20:06:12 CET 2013
0
1
2
3
4
5
6
7
8
9
Mon Nov 11 20:06:12 CET 2013
10

しかし、私は得る:

0
1
2
3
...
19
Mon Nov 11 20:06:12 CET 2013
Mon Nov 11 20:06:12 CET 2013
Mon Nov 11 20:06:12 CET 2013
...
Mon Nov 11 20:06:12 CET 2013

したがって、同時ではなく順次に見えます。スピードのせい?

4

2 に答える 2

3

2 番目のスレッドの作成には、最初のスレッドを完了するのに必要な時間よりも時間がかかります。これを行う:

public class ThreadTest {

   public static void main(String args[]) {
       Thread t1 = new Thread(new Thread1());
       Thread t2 = new Thread(new Thread2());
       t1.start();
       t2.start();
   }

}

public class Thread1 implements Runnable {

   @Override
   public void run() {
       for (int i = 0; i < 200000; i++) {
            System.out.println(new java.util.Date());
        }
    }

}

public class Thread2 implements Runnable {

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

}

疑わしい場合は、200000 の代わりに Integer.MAX_VALUE を使用してください。

于 2013-11-11T19:12:56.447 に答える
2

これは、20 個の日付を出力するのが思ったよりもはるかに高速であり、2 番目のスレッドの最初の命令が実行される前に最初のスレッドがそのタスクを完了しているためです。

または、スレッド 2 にその命令を実行させる前に、スケジューラがスレッド 1 のすべての命令を実行することを決定したためです。

各スレッドがより多くのことを行うようにすると、並列処理が見られるようになります。Thread.sleep()または、ループに呼び出しを追加して、同じことを遅くします。

于 2013-11-11T19:12:44.110 に答える