[size=medium]
对于Thread来说只想说两个方法,一个是setDaemon(false|true),另一个是join()。
[b]首先说说守护线程[/b]
这么东西是干什么用的?对于 Java应用我们都知道main方法是入口,它的运行代表着主线程开始工作了,我们也知道JVM里面有垃圾回收器的存在使得我们放心让main飞 奔,然而这背后的故事是垃圾回收线程作为守护着主线程的守护线程默默的付出着。很像那个啥啊,呵呵。令人发指的是main这个畜生背后 其实有好几个守护线程默默的付出!当然如果硬是要把守护线程比做女人,非守护线程比做男人的话,那么一个男人背后可以有多个默默付 出的女人。Java在设计时就默认了这个现实社会不太能实现的现实,并且强制规定如果男人不在了,这个虚拟世界就over了,看来资本主义 社会下长大的孩子创造的东西骨子里是封建社会的血脉啊!扯远了,对的,JVM内部的实现是如果运行的程序只剩下守护线程的话,程序将 终止运行,直接结束。所以守护线程是作为辅助线程存在的,主要的作用是提供计数等等辅助的功能。下面写个小例子说明一下:
[/size]
[size=medium]这个例子的结果是main主线程睡两秒之后说再见,而子线程则是在这两秒内计计数然后跟着一起说再见。当然它很不情愿,因为它想计 10秒,但是没机会。把t.setDaemonThread(true)注释掉你会看到主线程说再见了,但是子线程快快乐乐的计完数说再见。这就是守护线程 的作用,一切以非守护线程为主!很痴情啊,哈哈。
[b]另一个就是join方法,[/b]
在简单的多线程编程中,常常使用它来控制线程的执行顺序,也仅仅是一小部分的作用。它的内部实现是wait(0) 直至被调用线程执行完毕,调用线程才被唤醒。还是写个小例子解释一下:
[/size]
[size=medium] 在这个例子中,被调用join()的线程是t,而调用线程则是main所以会先打印下面的那句再打印上面的,即使t要先睡两秒,main也得等 着。把t.join()注释掉,main就可以扬眉吐气了。
很多情况下我们用不到多线程,但是不幸或者幸运的是硬件的发展,在核心频率因为晶体管密度的物理原因而很难再有突破时,CPU制造 商都开始从核心的数量上做文章了。从双核到4核,6核,8核,16核,48核...这么多核心带来了编程的转变,越来越多的程序需要考虑多核 多线程的优势,加上技术发展的原始推动力--商业需求,共同推进了多线程编程时代。因为并发优势而被炒作为Java终结者的Scala慢慢的 抬起头来,我也简单的学习了其部分内容,在多线程的编程上的确也没Java这么多的陷阱,封装的更简洁。Java始终给人的感觉是写了很多 ,做的很少,这种感觉程序员或许能接受,毕竟代码量上去了,但是估计烧钱的老板会疯掉。不过看到JDK7将会大量的改进 java.util.concurrent包的实用性和并发性能的提高,或许掌握Java多线程的门槛会低一点。但愿不用混搭语言解决问题,虽然都是跑在 JVM上的静态语言。关于java.util.concurrent包的整理,还没想好搞透彻,暂时无话可说。[/size]
对于Thread来说只想说两个方法,一个是setDaemon(false|true),另一个是join()。
[b]首先说说守护线程[/b]
这么东西是干什么用的?对于 Java应用我们都知道main方法是入口,它的运行代表着主线程开始工作了,我们也知道JVM里面有垃圾回收器的存在使得我们放心让main飞 奔,然而这背后的故事是垃圾回收线程作为守护着主线程的守护线程默默的付出着。很像那个啥啊,呵呵。令人发指的是main这个畜生背后 其实有好几个守护线程默默的付出!当然如果硬是要把守护线程比做女人,非守护线程比做男人的话,那么一个男人背后可以有多个默默付 出的女人。Java在设计时就默认了这个现实社会不太能实现的现实,并且强制规定如果男人不在了,这个虚拟世界就over了,看来资本主义 社会下长大的孩子创造的东西骨子里是封建社会的血脉啊!扯远了,对的,JVM内部的实现是如果运行的程序只剩下守护线程的话,程序将 终止运行,直接结束。所以守护线程是作为辅助线程存在的,主要的作用是提供计数等等辅助的功能。下面写个小例子说明一下:
[/size]
package thread;
public class DaemonSample {
public static void main(String[] args) throws Exception {
DaemonThread t = new DaemonThread();
t.setDaemon(true);// this is set t thread as a daemon thread.
t.start();
Thread.sleep(2000);
System.out.println("main thread exit.");
}
}
class DaemonThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("i=" + i);
}
}
}
[size=medium]这个例子的结果是main主线程睡两秒之后说再见,而子线程则是在这两秒内计计数然后跟着一起说再见。当然它很不情愿,因为它想计 10秒,但是没机会。把t.setDaemonThread(true)注释掉你会看到主线程说再见了,但是子线程快快乐乐的计完数说再见。这就是守护线程 的作用,一切以非守护线程为主!很痴情啊,哈哈。
[b]另一个就是join方法,[/b]
在简单的多线程编程中,常常使用它来控制线程的执行顺序,也仅仅是一小部分的作用。它的内部实现是wait(0) 直至被调用线程执行完毕,调用线程才被唤醒。还是写个小例子解释一下:
package thread;
public class JoinSample {
public static void main(String[] args) throws Exception {
Thread t = new Thread(new SubThread());
t.start();
t.join();
System.out.println("The end of main thread...");
}
}
class SubThread implements Runnable {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The end of sub thread...");
}
}
[/size]
[size=medium] 在这个例子中,被调用join()的线程是t,而调用线程则是main所以会先打印下面的那句再打印上面的,即使t要先睡两秒,main也得等 着。把t.join()注释掉,main就可以扬眉吐气了。
很多情况下我们用不到多线程,但是不幸或者幸运的是硬件的发展,在核心频率因为晶体管密度的物理原因而很难再有突破时,CPU制造 商都开始从核心的数量上做文章了。从双核到4核,6核,8核,16核,48核...这么多核心带来了编程的转变,越来越多的程序需要考虑多核 多线程的优势,加上技术发展的原始推动力--商业需求,共同推进了多线程编程时代。因为并发优势而被炒作为Java终结者的Scala慢慢的 抬起头来,我也简单的学习了其部分内容,在多线程的编程上的确也没Java这么多的陷阱,封装的更简洁。Java始终给人的感觉是写了很多 ,做的很少,这种感觉程序员或许能接受,毕竟代码量上去了,但是估计烧钱的老板会疯掉。不过看到JDK7将会大量的改进 java.util.concurrent包的实用性和并发性能的提高,或许掌握Java多线程的门槛会低一点。但愿不用混搭语言解决问题,虽然都是跑在 JVM上的静态语言。关于java.util.concurrent包的整理,还没想好搞透彻,暂时无话可说。[/size]