6

我正在玩 Java 中的线程。
我在一个网站上找到的以下示例:

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

创建第二个线程需要的时间比第一个需要完成的时间要长。做这个:

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);
        }
    }

}

如果有疑问,请使用 Integer.MAX_VALUE 而不是 200000。

于 2013-11-11T19:12:56.447 回答
2

这是因为打印 20 个日期比您想象的要快得多,因此第一个线程在执行第二个线程的第一条指令之前完成了它的任务。

或者是因为调度程序决定在让线程 2 执行其指令之前执行线程 1 的所有指令。

让每个线程做更多的事情,你就会开始看到并行性。Thread.sleep()或者通过在循环中添加调用让它们做同样的事情,但速度更慢。

于 2013-11-11T19:12:44.110 回答