background image

        {
            ae.next();
        }
    }

}
  程序注解如下:
  AlwaysEven 类里有一个属性 i,next 方法每执行一次 i 的值会自动加 2,getValue
返回 i 的数值。在 main 函数里我们构建了一个 AlwaysEven 对象 ae,注意这个变量前一
定要用 final,否则在监控线程里是不能访问到这个变量,最后我们写了一个死循环:调
用 next 方法。
  当我们多次执行这个 main 函数,发现打印出来的结果都会不一样。这个现象道出了
运用线程所会遇到的一个基本问题:我们永远都不知道线程何时会运行。这个感觉就像我
们创造了一支笔,想用它写字,写着写着,在没有任何征兆的情况下笔不见了,这个实
在是很郁闷,但这种情况就是我们在写并发程序经常会遇到的问题。
  上面的例子也表现了不同线程共同使用一个资源的现象,监控线程监视 ae 对象里 i
属性的数值变化,在主线程 main 里面又不断调用 next 方法增加 i 的数值。这就是在争抢
同一个资源的实例。
  为了更好阐述我后面要阐述的内容,这里我要补充一下在上篇里漏掉的一部分线程
的知识:后台线程(daemon)。后台线程(daemon)是指在程序运行的时候在后台提供一
种通用服务的线程,并且这种线程不是属于程序里不可或缺的部分。所以,当所有的非后
台线程结束时,程序也就终止了,反过来说只要有任何非后台线程还在运行,程序就不
会终止。大家看下面的代码:
package cn.com.sxia;

public class SimpleDaemon extends Thread {

    public SimpleDaemon(){
        setDaemon(true);
        start();
    }   
    public void run(){
        while(true){
            try {
                sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(this);
        }
    }    
    public static void main(String[] args) {
        for (int i = 0;i < 10;i++){
            new SimpleDaemon();