并发或顺序?

时间:2013-11-11 19:09:13

标签: java multithreading concurrency

我正在玩Java中的Threads 我在网站上找到以下示例:

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

所以它似乎不是并发的而是顺序的。是因为速度吗?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

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

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

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