- 浏览: 130466 次
- 性别:
- 来自: ...
文章分类
最新评论
对于Thread来说只想说两个方法,一个是setDaemon(false|true),另一个是join()。首先说说守护线程,这么东西是干什么用的?对于Java应用我们都知道main方法是入口,它的运行代表着主线程开始工作了,我们也知道JVM里面有垃圾回收器的存在使得我们放心让main飞奔,然而这背后的故事是垃圾回收线程作为守护着主线程的守护线程默默的付出着。。。很像那个啥啊,呵呵。令人发指的是main这个畜生背后其实有好几个守护线程默默的付出!当然如果硬是要把守护线程比做女人,非守护线程比做男人的话,那么一个男人背后可以有多个默默付出的女人。Java在设计时就默认了这个现实社会不太能实现的现实,并且强制规定如果男人不在了,这个虚拟世界就over了,看来资本主义社会下长大的孩子创造的东西骨子里是封建社会的血脉啊!扯远了,对的,JVM内部的实现是如果运行的程序只剩下守护线程的话,程序将终止运行,直接结束。所以守护线程是作为辅助线程存在的,主要的作用是提供计数等等辅助的功能。下面写个小例子说明一下:
这个例子的结果是main主线程睡两秒之后说再见,而子线程则是在这两秒内计计数然后跟着一起说再见。当然它很不情愿,因为它想计10秒,但是没机会。把t.setDaemonThread(true)注释掉你会看到主线程说再见了,但是子线程快快乐乐的计完数说再见。这就是守护线程的作用,一切以非守护线程为主!很痴情啊,哈哈。
另一个就是join方法,在简单的多线程编程中,常常使用它来控制线程的执行顺序,也仅仅是一小部分的作用。它的内部实现是wait(0)直至被调用线程执行完毕,调用线程才被唤醒。还是写个小例子解释一下:
在这个例子中,被调用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包的整理,还没想好搞透彻,暂时无话可说。
/** * User: yanxuxin * Date: Dec 10, 2009 * Time: 7:16:55 PM */ 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); } } }
这个例子的结果是main主线程睡两秒之后说再见,而子线程则是在这两秒内计计数然后跟着一起说再见。当然它很不情愿,因为它想计10秒,但是没机会。把t.setDaemonThread(true)注释掉你会看到主线程说再见了,但是子线程快快乐乐的计完数说再见。这就是守护线程的作用,一切以非守护线程为主!很痴情啊,哈哈。
另一个就是join方法,在简单的多线程编程中,常常使用它来控制线程的执行顺序,也仅仅是一小部分的作用。它的内部实现是wait(0)直至被调用线程执行完毕,调用线程才被唤醒。还是写个小例子解释一下:
/** * User: yanxuxin * Date: Dec 11, 2009 * Time: 6:27:04 PM */ 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..."); } }
在这个例子中,被调用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包的整理,还没想好搞透彻,暂时无话可说。
发表评论
文章已被作者锁定,不允许评论。
-
一道位操作的趣味编程题
2010-03-14 10:50 2080看到一道很有意思的编程题:大厅里有64盏灯,每盏灯都编 ... -
一道字符串截取的编程题
2010-03-11 10:52 2272最近接触到一道字符串截取的编程题:编写一个截取字符串的 ... -
一道多线程趣味热身题
2010-02-28 18:01 1912保持对知识点或者技术的熟悉度对于程序员至关重要,要学会 ... -
疑似Google多线程面试题的Java实现
2010-02-24 17:39 4903来到一个完全陌生的地方,即将一切从新开始,内心兴奋又忐 ... -
Mina的线程池实现分析(2)
2010-02-10 17:31 4517分析了I/O事件的存储,下面看看多个Worker同时工 ... -
Mina的线程池实现分析(1)
2010-02-10 17:28 11571线程池是并发应用中,为了减少每个任务调用的开销增强性能 ... -
多线程基础总结十一--ConcurrentLinkedQueue
2010-02-03 17:52 12835ConcurrentLinkedQueue充分使用了a ... -
LinkedBlockingQueue应用--生产消费模型简单实现
2010-01-29 20:45 8132之前介绍时LinkedBlockingQueue提到了 ... -
多线程基础总结十--LinkedBlockingQueue
2010-01-28 14:33 15369随着多线程基础总结的增多,却明显的感觉知道的越来越少, ... -
号称放倒一片的一道J2SE基础题的个人理解
2010-01-23 14:07 2788近日无意中看到一道Java基础题,号称在接受测试的10 ... -
多线程基础总结九--Mina窥探(1)
2010-01-21 23:46 5393一直以来的多线程的基础总结都是脱离应用的,但是要说多线 ... -
多线程基础总结八--ReentrantReadWriteLock
2010-01-15 23:22 7506说到ReentrantReadWriteLock,首先 ... -
多线程基础总结七--ReentrantLock
2010-01-09 23:17 7673之前总结了部分无锁机制的多线程基础,理想的状态当然是利 ... -
关于atomic问题的一点理解
2009-12-30 16:42 2434之前看到一个帖子是关于atomic使用的,当时没有仔细 ... -
多线程基础总结六--synchronized(2)
2009-12-18 18:45 1866早在总结一时,我就尽量的把synchronized的重点 ... -
多线程基础总结五--atomic
2009-12-17 19:46 3545在简单介绍java.util.c ... -
多线程基础总结四--ThreadLocal
2009-12-16 19:48 2716说到ThreadLocal,首先 ... -
多线程基础总结三--volatile
2009-12-15 20:09 2522前面的两篇总结简 ... -
多线程基础总结一--synchronized(1)
2009-12-12 23:23 3066最近写关于并发的小应 ... -
由destory-method引发的IOC容器设计的思考
2009-12-07 16:51 1678第一次读Spring的源 ...
相关推荐
十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五...
我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于线程切换的实现方式。 几点基础 多线程切换,大概可以切分为这样几个内容:如何开启多个线程,如何定义每个线程的任务,如何在线程之间...
经过总结,Python创建多线程主要有如下两种方法: 函数 类 接下来,我们就来揭开多线程的神秘面纱。 . 学会使用函数创建多线程 在Python3中,Python提供了一个内置模块 threading.Thread,可以很方便地让我们创建...
本文主要总结了Java多线程开发中线程创建时多用到的创建方式(不同的构造函数)以及线程组相关的基础知识
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 个人总结 在C#中我们开启一个应用程序就是打开了一个...
【完整课程列表】 Java高级教程课件 java数据库教程 JDBC教程 1-java_IO(1)(共47页).ppt Java高级教程课件 java数据库教程 JDBC教程 1-java_...Java高级教程课件 java数据库教程 JDBC教程 8-IO&线程总结(共7页).ppt
线程的知识太多,知识点有深有浅,往深的研究会涉及操作系统、CPU、内存,往浅了说就是一些语法。没有一定的知识积累,很难把线程的知识写得全面,当然我也没有这个能力。所以想到一个点写一个点,尽量总结一些有用...
RT-Thread使用情况概述(简要总结下应用中RT-Thread使用情况:内核部分、组件部分、软件包部分、内核、其他)使用了RT-Thread内核中使用线程、信号量、 邮箱、内存池等功能,在读取到传感器数据后,将气压和温度数据...
调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 消息队列:用来实现线程之间传递的数据。 组件部分:SPI框架, Sensor框架,SAL 套接字抽象层 SPI框架:使用 SPI 框架来驱动温度传感器,上层代码可以提高...
本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时...from weakref import ref # ref用在了构造大字典元素元组的第一个位置即 (ref(Thread), 线程字典) from contextlib i
Java高级教程课件 java数据库教程 JDBC教程 1-java_IO(1)(共47页).ppt Java高级教程课件 java数据库教程 JDBC教程 1-java_IO(2)(共28页)....Java高级教程课件 java数据库教程 JDBC教程 8-IO&线程总结(共7页).ppt
RT-Thread使用情况概述(简要总结下应用中RT-Thread使用情况:内核部分、组件部分、软件包部分、内核、其他)(1)内核部分:调度器,信号量,libcpu/BSP。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步...
【多线程】多线程的实现方式Thread、Runnable、Callable 72 【多线程】实现Runnable接口与继承Thread类比较 73 【多线程】线程状态转换 74 【多线程】线程的调度 75 线程优先级 75 sleep 76 wait 76 yield 77 join ...
一、多线程基础 示例项目:concurrency01-thread-basis 进程与线程 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以...
通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 终止线程的典型方法(重要!!!) 171 ...
§10.1 多线程处理 69 §10.1.1 线程创建 69 §10.1.2 线程操作 70 §10.1.3 线程和异常 71 §10.1.4 线程调度 73 §10.1.5 线程同步 73 §10.2 多进程处理 79 §10.2.1 进程创建 79 第十一章 基本I/O操作 80 §11.1...
(2)多线程可以用三种方式实现,继承thread类,实现runnable接口的实现类实例传入thread构造器创建thread实例, 实现callable接口的实现类实例传入future task构造器,将futuretask对象传入thread构造器,用...
多线程抓取4. 多进程抓取三. 总结 一. 基础理论 1. 进程与线程 什么是进程?什么是线程? 百度百科中是这样解释的: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...