2010-12-07 78 views
5

我刚开始学习线程,并误解了它们的工作原理。使线程正常工作

这里是我的类:

public class MyThread extends Thread { 
    private static int NUM = 0; 
    private int id; 

    public MyThread() { 
     id = NUM++; 
    } 

    public static void main(String[] args) { 
     for (int i = 0; i < 10; i++) { 
      new MyThread().start(); 
     } 
    } 

    public void run() { 
     System.out.println(id + " started"); 

     try { 
      Process p = Runtime.getRuntime().exec("javac -version"); 
      p.waitFor(); 
     } catch (Exception e) { 
      System.out.println("Call a doc!"); 
     } 

     System.out.println(id + " finished"); 
    } 
} 

/* 
Just a sidenote. 
I am creating new javac process just to slow an application down. 
Simple System.out.println(…) is a way faster. 
*/ 

为什么我总是得到所有在第一,之后“......完成”的消息“......开始”的消息?无论我开始有多少个线程,我总会看到:

0 started 
1 started 
2 started 
3 started 
4 started 
5 started 
6 started 
7 started 
8 started 
9 started 
0 finished 
1 finished 
3 finished 
4 finished 
8 finished 
5 finished 
2 finished 
6 finished 
9 finished 
7 finished 

线程的目的不是并行执行吗?
也许我需要同步一些东西?还是犯了粗心的错误?要么…?
请解释。

UPDATE:

为什么我看不到,让我们说:

0 started 
1 started 
0 finished 
2 started 
1 finished 
2 finished 

谢谢大家接受治疗。

+0

你的英文很好。好问题。 – sje397 2010-12-07 17:38:14

+0

@ sje397谢谢你,先生! – Mick 2010-12-07 17:55:03

回答

2

线程是并行的。否则,在下一个“开始”之前,您会看到每个线程“已完成”。

减慢线程速度的一种简单方法是使用Thread.sleep(10 * 1000);睡觉10秒(10,000毫秒)

编辑:一个简单的方法看到线程交错是有一个固定大小的线程池。

ExecutorService pool = Executors.newFixedThreadPool(4); 
for (int i = 0; i < 10; i++) { 
    final int id = i; 
    pool.submit(new Callable<Void>() { 
     public Void call() throws InterruptedException { 
      System.out.println(id + " started"); 
      Thread.sleep(1000); 
      System.out.println(id + " finished"); 
      return null; 
     } 
    }); 
} 

打印

0 started 
1 started 
2 started 
3 started 
0 finished 
4 started 
1 finished 
5 started 
2 finished 
6 started 
3 finished 
7 started 
4 finished 
8 started 
5 finished 
6 finished 
9 started 
7 finished 
8 finished 
9 finished 
2

看起来不错。您可以从输出中看到线程是交错的。线程开始启动,获得上下文切换,并被调度程序选中,例如,您可以看到线程8跳到线程5之前的位置。如果所有的数字都是一致的,这将是奇怪的,但这似乎很好。

使用睡眠时间,就像Peter Lawrey所说的那样,因此您可以更改每个线程更容易处理的时间。正如你的例子所展示的,开始一个过程需要很多时间,看起来合理,你的所有线程都应该在完成之前开始。

1

如果您在run()方法中放置了一个从1到20的简单循环,则可以更好地看到执行的交错。

1

如果你想看到一个“随机”的开始和结束你可能要添加一个

或类似到线程。