在Zookeeper的java客户端API 我们了解到Zookeeper客户端里面有Listener这一个线程一直在等待事件触发,既然有一个线程一直在,那么我们应该就不需要在业务线程中写Thread.sleep(Long.MAX_VALUE);
我们可以写一个简单的demo来看看:
package cn.itcast.bigdata.zkdist;
public class Test {
public static void main(String[] args) {
System.out.println("主线程开始了");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程开始了");
while(true){
}
}
});
thread.start();
}
}
我们运行的时候可以发现,这个程序一直没有结束。
所以只要我们有一个线程在,我们的程序就不会停止。那为什么我们在zookeeper的客户端的业务线程还需要Thread.sleep(Long.MAX_VALUE);
让程序不停止。
因为我们zookeeper里面的两个线程connector和listener都是守护线程。zookeeper设计的时候必须把这两个线程设置为守护线程,否则我们业务线程就退不出来了。
我们下面来看看一个守护线程的demo:
package cn.itcast.bigdata.zkdist;
public class Test {
public static void main(String[] args) {
System.out.println("主线程开始了");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程开始了");
while(true){
}
}
});
//设置为守护线程
thread.setDaemon(true);
thread.start();
}
}
运行后可以发现,程序退出了,启动的线程也退出了。