think in java中并发

/**

 *  守护线程

 */

public class Daemons {

 

    /**

     * @param args

     * @throws InterruptedException

     */

    public static void main(String[] args) throws InterruptedException {

        Thread d = new Thread(new Daemon());

        d.setDaemon(true); //必须在启动线程前调用

        d.start();

        System.out.println("d.isDaemon() = " + d.isDaemon() + ".");

        TimeUnit.SECONDS.sleep(1);

    }

 

}

 

class DaemonSpawn implements Runnable {

 

    public void run() {

        while (true) {

            Thread.yield();

        }

    }

   

}

 

class Daemon implements Runnable {

    private Thread[] t = new Thread[10];

 

    public void run() {

        for (int i=0; i<t.length; i++) {

            t[i] = new Thread(new DaemonSpawn());

            t[i].start();

            System.out.println("DaemonSpawn " + i + " started.");

        }

        for (int i=0; i<t.length; i++) {

            System.out.println("t[" + i + "].isDaemon() = " +

                    t[i].isDaemon() + ".");

        }

        while (true) {

            Thread.yield();

        }

    }

   

}

 

运行结果:

d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.
t[0].isDaemon() = true.
t[1].isDaemon() = true.
t[2].isDaemon() = true.
t[3].isDaemon() = true.
t[4].isDaemon() = true.
t[5].isDaemon() = true.
t[6].isDaemon() = true.
t[7].isDaemon() = true.
t[8].isDaemon() = true.
t[9].isDaemon() = true.

clipboard.png

clipboard.png

在第二版的664页,其中我看到这两个while() yield()(使任务一直处于让出线程的状态);
一直让出线程?这有什么意义呢?比如DaemonSpawn,这个任务 你让他平平静静的执行完不就好了吗?执行完
就解放线程了。Daemon中的while() yield(); 又有什么意义呢?main本来就只启动了一个线程来执行Daemon任务
那让他平平静静执行完不就好了吗。。。。。。。对角懵逼,线性懵逼啊

谁能系统的解释一下吗????
ps:最近在学线程,各位有什么方法,书籍,途径 介绍吗?看think in java看的好吃力

阅读 1.4k
1 个回答

Daemon是驻留线程,目的是长期执行任务,如果一次就结束了,可能也就没有必要称其为Daemon了.

改成下面这样你可能就好理解了.

 public void run() {

        while (true) {

            doSomeThingAgainAndAgainFromTimeToTime();

            Thread.yield();

        }

    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题