1.Java 中的线程
   
线程允许程序同一时间做很多任务,至少,看起来那些任务是并发执行的。在我的并发编程的帖子里有介绍线程的基本概念;我们知道在任一特定时刻仅有一个线程
在执行,但是 CPU
给每个线程一小片时间运行(通过时间片)然后来回在线程间快速的切换。这就是我们所看到的多线程运行的样子。这里的cpu指的是单处理器的情况,因为对于
多处理器的话,多线程调度机制将会将各个任务分配到不同处理器上来实现,这样cpu时间片切片的行为就并不频繁,也就大大提升了程序的执行效率了;

Java 语言使用 Thread 类内建了对线程的支持。当一个线程被通知运行,该线程上的任务对应的 run()
方法就被执行。线程的启动是调用Thread的start方法,当然线程启动不一定就一定会被执行,这和它说对应的资源环境存在关系;如果资源忙的话,则
线程将处于阻塞的状态;

·线程的生命周期

    线程在它的生命周期中会是几种可能的状态中的一种。在同一时刻只能处于一种状态,这些状态是由 JVM 指示的,而不是操作系统。线程状态列示如下:

    ·新建

  1. Thread thread=new Thread(new SimpleTask());

当一个新的线程被创建后,它就被指定为新建状态。线程在此状态时不会被分配任何系统资源

    ·可运行

  1. thread.start();

要使线程转到可运行状态,必须调用 start() 方法。

    ·阻塞

      一个线程如果已经启动,则在其任务处理的过程中产生系统资源不足,或系统资源被锁,则该线程将被阻塞;则等待系统资源释放后,线程会继续执行任务;

    ·等待中

  1. thread.sleep();

·指定时间的等待

  1. thread.wait();

·结束

  1. Thread.yield();

当调用了新建线程的 start()
方法,线程进入到就绪状态并被认为是运行中的。这不代表这个线程实际正在执行指令。即使线程的状态被设置为可运行,已安排去运行,它或许不得不等到其他执
行中的线程结束或被临时挂起。JVM 来决定哪个线程该获得下次运行的机会。JVM 决定下个线程的行为依赖于数个因素,包括操作系统、特定的 JVM
实现和线程优先级及其他因素。

    

    下面是一个java线程生命的图

2.线程与进程之间的区别

   每一个 Java 程序被指派一个进程。程序接着把任务分派到线程中。甚至是你在写一个仅包含一个 main() 方法的 "Hello, World" 程序,程序仍然要使用线程,虽然只有一个。

有时候,所谓“轻量级进程”指的就是线程。这与实际的操作系统进程“重量级”一词形成对比。假如你正在使用 Windows 系统,你可以在任务管理器中看到运行着的重量级进程,但是你看不到线程;

   下面是一个多个线程进行程序运行实例图



   从上面看出,对于一个单cpu的机器,线程通常不会并发着运行的,同一时刻只能有一个线程才能得到 CPU 的参与执行。每一个 JVM
和操作系统对此处理方式可能有所不同,然而,有时,一个线程可能要执行完成后,另一线程才能接着运行。这就是所知的“非抢先式”。其他的,一个线程中途被
打断来让其他线程做它们的事。这被称做“抢先式”。一般的,线程必须完成运行后另一线程才能获得 CPU,这种对 CPU
资源的竟争通常是基于线程优先级的;

3.什么是线程优先级?

   我们已多次提到,可运行线程是否能获得下次运行机会是由 JVM 来决定的。JVM 支持的一种知名的调度方案“固定优先级调度”,它调度线程是基于它们与其他可运行线程优先级相比较而定的。

优先级是一个指定给新线程的整数值,它还应参考创建它的父线程的优先级。这个值从 Thread.MIN_PRIORITY (等于 1),到
Thread.MAX_PRIORITY (等于 10)。这些常量值在 java.lang.Thread 类中有定义的,这个值越大 (最大到
MAX_PRIORITY),所具有的优先级就越高。除非特别指定,Java 程序中多数刚创建的线程运线在
Thread.NORMAL_PRIORITY (恰好是个中值 5) 级别上。你可能用 setPriority() 方法来修改线程的优先级。

通常,一个运行着的线程持续运行直到下面情况中的一个:

·线程让出 CPU (可能是调用了它的 sleep() 方法、yield() 方法或者是 Object.wait() 方法)。

·线程的 run() 结束了。

·OS 支持时间片的话,它的时间到了

·另一高优先级的线程变为了可运行状态

4.什么叫做守护线程?

    守护线程有时指的是服务线程,因为他们运行在很低的优先级别上(在后台),完成些非紧急但却本质的任务。例如,Java
的垃圾回收器就是一个守护线程的例子。这个线程运行在后台,查找并回收程序不再使用的内存。你可以通过传递 true 给 setDaemon()
方法使线程成为守护线程。不然,这个线程就是一个用户线程。你仅能在线程启动之前把它设置为守护线程。守护线程有点特别的就是假如只有守护线程在运行而没
有活着的非守护线程,此时 JVM 仍然是存在的。

5. Java 线程组和线程池

    线程组:Java 的 ThreadGroup 由 java.lang.ThreadGroup
类实现的,描绘的是一组行为如单一实体般的线程。每一个 Java
线程都是线程组的成员。在一个线程组中,你可以停止或启动所有的线程组成员。你还可以设置线程优先级和执行其他线程的通用功能。线程组对于构建像
Quartz 那样的多线程程序是非常有用的。当一个 Java 程序启动后,它就创建了一个叫做 main 的
ThreadGrop。除非特别指定,所有创建的线程都会成为这个组的成员。当一个线程被指定到某个 ThreadGroup 时,它才会被改变。

     线程迟:Java 1.5 引入一个新的概念到 Java
语言中,称之线程池。第一眼看来,这有些像是线程组,但是它实际是用于不同目的的。尽量多个线程能从属于一个相同的 ThreadGroup
中,组是享用不到典型的池化资源带来的好处的。这就是说,线程组仅仅是用于对成员的组织。线程池是可共享的资源,是一个能被用来执行任务的可管理的线程集
合。线程池(通常讲的资源池)
比非池化资源提供了几点好处。首先也是首要的,资源池通过减少过度的对象创建改善了性能。假如你实例化十个线程,并重复的使用它们,而不是每次需要一个都
创建一个新的线程,你将会改善程序的性能。这个概念在 Java 和 J2EE
领域中比比皆是。另外的优点包括能限制资源的数量,这有助于程序的稳定性和可扩展性。这是一个非常有意义的特征,而不管你所用的是什么语言,或是什么程
序。

企业级任务调度框架Quartz(7) 线程在Quartz里的意义(1)的更多相关文章

  1. 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)

    前序:      做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...

  2. Quartz:不要重复造轮子,一款企业级任务调度框架。

    背景 第一次遇到定时执行某些任务的需求时,很多朋友可能设计了一个小类库,这个类图提高了一个接口,然后由调度器调度所有注册的接口类型,我就是其中之一,随着接触的开源项目越来越多,我的某些开发习惯受到了影 ...

  3. 企业级任务调度框架Quartz(6) 任务调度器(Scheduler)

    前序:      我们已经在前面的内容能里看到了,我们用 Scheduler 来管理我们的 Job:创建并关联触发器以使 Job 能被触发执行:以及如可选择 calendar 为给定的时程安排提供更多 ...

  4. 企业级任务调度框架Quartz(5) Quartz的声明式配置

    前序:     前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示:但具体到实际的时候,如果我们要在 Job 启动之后改变它的执行时间和频度,则必须去修改源代码重新编译,我们很难去以编程的 ...

  5. 企业级任务调度框架Quartz(1) --企业应用中的任务调度介绍

    由于目前的工作内容为建行CLPM批处理业务的设计工作,所以很好的理解批处理所用的任务调度框架Quartz势在必行:为了能够更好的去服务于工作,也 为了提升自己,所以我学习了Quartz Job Sch ...

  6. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  7. 企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上

    前序:     在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动:下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上!     首先一个job类指向两 ...

  8. 企业级任务调度框架Quartz(2)-下载和安装Quartz

    1.下载和安装 Quartz 根据资料上提供的网址http://www.opensymphony.com/quartz 我们可以下载到Quartz的最新版本1.6.4: 2.下载后包的说明       ...

  9. 企业级任务调度框架Quartz(9) Quartz之作业触发器Trigger

    前序:      我们已经大概对Quartz的基本有了一个大概的认识:现在我们将要逐渐对Quartz的各个重要组件进行学习:前面已经对job进行了详细讲解,现在我们来认识下它的一个重要兄弟,没有它,作 ...

随机推荐

  1. java IO框架分析

    jave.io框架 2010-11-10 22:18:34|  分类: 默认分类|举报|字号 订阅     可从IO的类层次,IO框架的设计模式来论述. 总体来说,IO可以分为字节流和字符流,不同在于 ...

  2. 使用VS Code断点调试PHP

    vs code 使用一款杰出的轻量级代码编辑器,其中的插件工具不胜枚举而且还在不断增加.使用 vs code 调试 php 代码更是方便简洁,下面我们来一起看一下. 1. 安装 XDebug 扩展 调 ...

  3. CODEVS——T 1297 硬币

    http://www.codevs.cn/problem/1297/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descrip ...

  4. UVA 10039 Railroads

    这道题好吧,一开始便是拓扑排序的想法,搞了好久,试了多组测试数据,没错啊,可是没过...作孽啊,竟然忘了拓扑不能处理环,白浪费了一晚上... 只好用动态规划了.. DP[time][city]表示在t ...

  5. 用Thinphp发送电子邮件的方法

    好长时间没有动php了,突然想用thinkphp发送电子邮件,可是查阅了书籍都写的非常乱.没有继续看下去.这里找到了一个比較好的方法: 第一步:首先我们要引入一个外部类库:Mail.class.php ...

  6. ftk学习记(label篇)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 还是接着上面的一篇博文. 之前以前答应过大家,让大家看一下最简单的ftk程序是怎么执行的.所以 ...

  7. C++研究之在开发中你可能没有考虑到的两个性能优化

     1:多余的存储引用导致性能减少. 2:利用局部性提高程序性能: 先来说说引用是怎么减少程序性能.个人觉得减少程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余反复 ...

  8. 国产芯片任重道远 国科微SSD主控芯片的“追赶之路”(不能只提供一颗芯片,而是要将芯片、国密算法、固件Firmware、BIOS和操作系统紧密联系在一起,变成完整解决方案交给行业用户,才能真正体现自身的价值)

    集微网消息,“中国芯”战略之路道阻且长,踏入这个赛道的攻坚者们需要十年如一日的技术突破,需要集合产业势能,共同协作,方能建立中国核心技术真正的竞争力. 国产化之路任重道远,SSD芯片初见成效 信息时代 ...

  9. vim分屏功能

    转载,来自http://coolshell.cn/articles/1679.html 本篇文章主要教你如何使用 Vim 分屏功能. 分屏启动Vim 使用大写的O参数来垂直分屏. vim -On fi ...

  10. DNS隧道工具使用 不过其网络传输速度限制较大

    DNS隧道工具使用 http://www.freebuf.com/sectool/112076.html http://netsec.ccert.edu.cn/zhengming/2011/11/01 ...