但是进程的概念相对比较大,而且需要成为一个独立的程序,这样对于编程来说比较麻烦,所以在程序开发中设计了另外一个概念——线程。
线程(Thread)指同一个程序(进程)内部每个单独执行的流程。在前面的程序中每个程序内部都只包含一个系统流程,该流程从main方法开始,随着方法的调用进入到每个方法的内部,在方法调用完成以后返回到调用的位置,直到main方法结束以后则该流程结束,这个流程就是前面程序中的系统线程。Java语言对于线程的概念提供了良好的支持,在编程中实际使用线程也显得比其它语言要简单一些。
而在实际实现时,Java语言支持在一个程序内部同时执行多个流程,其中每个单独的流程就是一个线程。例如在QQ程序中,系统的线程负责响应用户的按键操作,在后台可以启动网络通讯的线程执行数据的发送和接收,这样两个流程之间同时执行,并协调进行工作。而在服务器端程序中,每个和服务器进行通讯的客户端,在服务器端都会启动一个对应的线程进行通讯,这样每个客户端才显得同时和服务器端进行通讯。
在很多地方,线程被看作是一种“轻量级进程”,因为使用线程和进程的改变比较类似,而且使用线程时对于系统资源,如内存、CPU等,的占用要比进程小很多,也就是有更小的系统开销。另外,同一个程序中的线程之间变量是共享的,线程之间的数据交换要比进程之间的数据交换简单一些。
总之,无论是进程的概念还是线程的概念,都使编程从串行编程(依次执行)进入到并行编程(同时执行)的领域,而在CPU内部实现的原理都是按照时间片进行切换。
多线程优势
线程的概念增加了编程的难度,也增加了程序的复杂度,但是该概念还是在程序内部大量进行使用,这主要因为多线程程序的优势。
多线程程序主要的优势有两个:
1、 提高界面程序响应速度
通过使用线程,可以将需要大量时间完成的流程在后台完成,例如现在常见的网络程序,在进行网络通讯时都需要使用单独的流程进行,也就是启动一个单独的线程进行,这样不会阻塞系统线程的执行,也就是不会阻塞对于界面的操作。另外,如果需要大量操作数据或进行数据变换的程序,也需要在后台启动单独的线程来提高前台界面的响应速度。
通过将程序逻辑独立成一个单独的线程,使得控制界面的系统线程和逻辑线程同时执行,避免了逻辑操作需要大量的时间阻塞系统的线程执行,从而大幅度提高界面程序的响应速度。
2、 充分利用系统资源
通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的吸能。就像一个人同时承担多份工作一样,这样可以使这个人的时间获得比较充分的使用。
当然,多线程程序也有一些不足,例如当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。
但是,相对于优势来说,劣势还是很有限的,所以在现在的项目开发中,多线程编程技术获得了广泛的使用。
线程生命周期
线程作为一个全新的概念,主要由系统进行管理,但是熟悉线程概念的各个阶段,是控制线程程序执行的基础,和以后学习的其它Java技术类似,线程在程序中从出现到消亡的各个阶段,在程序中统称为线程的生命周期。
在Java语言中线程的概念由java.lang.Thread类实现,在该类中封装线程的概念,并且将线程控制的相关方法包含在该类的内部。后续介绍中如果没有特别说明,则提到的方法均是Thread类内部的方法。
线程的生命周期中包含如下阶段:
1、 新建状态(New)
该状态指线程已经初始化完成,但是还没有启动。具体点说,也就是线程对象已经创建,准备工作已经完成。
2、 运行状态(Run)
运行状态是指线程的正常执行状态,处于该状态的线程在CPU内部执行程序,也就是线程正常运行时的状态。
3、 阻塞状态(Block)
阻塞状态指线程处于执行状态,但是由于没有获得CPU的执行时间,而处于CPU外部等待线程执行的状态。
4、 死亡状态(Dead)
死亡状态指线程执行结束,释放线程占用的系统资源,结束线程执行的状态。
在实际使用线程时,首先需要创建一个线程对象,在线程对象创建完成以后,该线程就处于新建状态了,在新建状态下的线程,已经初始化完成,但是还没有启动,也就是不会获得CPU的执行时间。在新建状态下,一般可以通过调用线程对象中的start方法,使线程进入到运行状态,start方法不阻塞程序的执行,在调用完成以后立刻就返回了。一旦线程进入运行状态,则开始排队进入CPU执行,根据系统的调度,线程就在运行状态和阻塞状态之间进行切换,这就是线程的执行状态。当线程执行完成或需要结束该流程时,则需要将线程切换到死亡状态,释放线程占用的资源,结束线程的执行。
另外在线程执行的过程中也可以根据需要调用Thread类中对应的方法改变线程的状态。例如使用线程对象的interrupt中断线程的执行,使线程进入到死亡状态;使用yield方法使当前正在执行的线程从运行状态切换到阻塞状态。
而具体线程编程的实现方式、线程的控制以及线程编程时需要注意的问题,则将在下面进行详细的介绍。
线程(Thread)指同一个程序(进程)内部每个单独执行的流程。在前面的程序中每个程序内部都只包含一个系统流程,该流程从main方法开始,随着方法的调用进入到每个方法的内部,在方法调用完成以后返回到调用的位置,直到main方法结束以后则该流程结束,这个流程就是前面程序中的系统线程。Java语言对于线程的概念提供了良好的支持,在编程中实际使用线程也显得比其它语言要简单一些。
而在实际实现时,Java语言支持在一个程序内部同时执行多个流程,其中每个单独的流程就是一个线程。例如在QQ程序中,系统的线程负责响应用户的按键操作,在后台可以启动网络通讯的线程执行数据的发送和接收,这样两个流程之间同时执行,并协调进行工作。而在服务器端程序中,每个和服务器进行通讯的客户端,在服务器端都会启动一个对应的线程进行通讯,这样每个客户端才显得同时和服务器端进行通讯。
在很多地方,线程被看作是一种“轻量级进程”,因为使用线程和进程的改变比较类似,而且使用线程时对于系统资源,如内存、CPU等,的占用要比进程小很多,也就是有更小的系统开销。另外,同一个程序中的线程之间变量是共享的,线程之间的数据交换要比进程之间的数据交换简单一些。
总之,无论是进程的概念还是线程的概念,都使编程从串行编程(依次执行)进入到并行编程(同时执行)的领域,而在CPU内部实现的原理都是按照时间片进行切换。
多线程优势
线程的概念增加了编程的难度,也增加了程序的复杂度,但是该概念还是在程序内部大量进行使用,这主要因为多线程程序的优势。
多线程程序主要的优势有两个:
1、 提高界面程序响应速度
通过使用线程,可以将需要大量时间完成的流程在后台完成,例如现在常见的网络程序,在进行网络通讯时都需要使用单独的流程进行,也就是启动一个单独的线程进行,这样不会阻塞系统线程的执行,也就是不会阻塞对于界面的操作。另外,如果需要大量操作数据或进行数据变换的程序,也需要在后台启动单独的线程来提高前台界面的响应速度。
通过将程序逻辑独立成一个单独的线程,使得控制界面的系统线程和逻辑线程同时执行,避免了逻辑操作需要大量的时间阻塞系统的线程执行,从而大幅度提高界面程序的响应速度。
2、 充分利用系统资源
通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的吸能。就像一个人同时承担多份工作一样,这样可以使这个人的时间获得比较充分的使用。
当然,多线程程序也有一些不足,例如当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。
但是,相对于优势来说,劣势还是很有限的,所以在现在的项目开发中,多线程编程技术获得了广泛的使用。
线程生命周期
线程作为一个全新的概念,主要由系统进行管理,但是熟悉线程概念的各个阶段,是控制线程程序执行的基础,和以后学习的其它Java技术类似,线程在程序中从出现到消亡的各个阶段,在程序中统称为线程的生命周期。
在Java语言中线程的概念由java.lang.Thread类实现,在该类中封装线程的概念,并且将线程控制的相关方法包含在该类的内部。后续介绍中如果没有特别说明,则提到的方法均是Thread类内部的方法。
线程的生命周期中包含如下阶段:
1、 新建状态(New)
该状态指线程已经初始化完成,但是还没有启动。具体点说,也就是线程对象已经创建,准备工作已经完成。
2、 运行状态(Run)
运行状态是指线程的正常执行状态,处于该状态的线程在CPU内部执行程序,也就是线程正常运行时的状态。
3、 阻塞状态(Block)
阻塞状态指线程处于执行状态,但是由于没有获得CPU的执行时间,而处于CPU外部等待线程执行的状态。
4、 死亡状态(Dead)
死亡状态指线程执行结束,释放线程占用的系统资源,结束线程执行的状态。
在实际使用线程时,首先需要创建一个线程对象,在线程对象创建完成以后,该线程就处于新建状态了,在新建状态下的线程,已经初始化完成,但是还没有启动,也就是不会获得CPU的执行时间。在新建状态下,一般可以通过调用线程对象中的start方法,使线程进入到运行状态,start方法不阻塞程序的执行,在调用完成以后立刻就返回了。一旦线程进入运行状态,则开始排队进入CPU执行,根据系统的调度,线程就在运行状态和阻塞状态之间进行切换,这就是线程的执行状态。当线程执行完成或需要结束该流程时,则需要将线程切换到死亡状态,释放线程占用的资源,结束线程的执行。
另外在线程执行的过程中也可以根据需要调用Thread类中对应的方法改变线程的状态。例如使用线程对象的interrupt中断线程的执行,使线程进入到死亡状态;使用yield方法使当前正在执行的线程从运行状态切换到阻塞状态。
而具体线程编程的实现方式、线程的控制以及线程编程时需要注意的问题,则将在下面进行详细的介绍。
发表评论
-
Struts标签 下拉框 迭代
2009-09-16 09:08 1589案例: select latnid from t_latn; ... -
控制WebLogic解压war包
2009-09-14 08:28 1722在开发web应用时,如果通过weblogic的控制台部署war ... -
线程的基本用法
2009-06-25 11:04 811实现多线程的方法有3种: 1.继承thread类 eg : ... -
Timer的用法
2009-06-25 09:07 1058使用Timer和TimerTask组合 最后 ... -
进程通俗解释
2009-06-24 08:21 878进程(Process)指操作系统中一个独立运行的程序。例 ... -
java 调用存储过程 和 PreperStmt的用法
2009-06-14 10:54 1272PreparedStatement 的用法PreparedSt ... -
MyEclipse更改快捷键
2009-06-14 08:22 2306MyEclipse安装完成之后,有一个很常用的快捷键Conte ... -
java最大公约数算法
2009-05-20 20:06 1851最大公约数算法:如果r是a和b之间相除后的余数,则a和b之间的 ... -
创建文件,并填写内容的几种方式
2009-05-15 08:23 975import java.io.*; public class ... -
java 存储过程传递数组类型的参数
2009-05-11 08:06 1504import java.sql.*; public cla ... -
javascript onpropertychange
2009-05-09 14:38 1083<!DOCTYPE HTML PUBLIC " ... -
java.math.BigDecimal的精度问题
2009-05-09 11:21 13511. String myMoney = "100 ... -
JAVA设计模式
2009-04-24 09:15 15091、FACTORY(工厂模式) 2、BUILDER(建造模式 ... -
Struts2入门与配置
2009-04-09 08:21 911年前在上海静静等待回家的日子 , 闲来无事,在好友李三年的 ... -
JavaMail
2009-04-03 09:00 716package com.tom; import org.ap ... -
javascript 动态增加删除表格
2009-02-28 09:19 802<!DOCTYPE HTML PUBLIC " ... -
在web.xml不认<taglib>解决办法:
2009-02-22 20:40 727在web.xml不认<taglib>解决办法: ... -
自己实现单点登录
2009-02-21 16:04 1050摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软 ... -
java多线程并发访问解决方案
2009-02-21 15:40 1432多线程并发访问解决方案 synchronized关键 ... -
JAVA字符串常用写法
2009-02-19 08:31 1483/** * Title: Java Bean 工 ...
相关推荐
### 进程与线程的生动形象理解 #### 一、引言 进程与线程作为操作系统中的核心概念,对于理解和开发高效的软件至关重要。本文旨在通过一个生动的类比来帮助读者更好地理解进程与线程的基本概念及其差异,并进一步...
良好的注释应包括功能说明、参数解释、返回值描述以及潜在的异常情况。 总结,C#的多线程编程提供了丰富的工具和机制,允许开发者高效地处理并发任务。合理运用这些知识,可以编写出高效、稳定且易于维护的多线程...
这份名为“Java开发中名词的通俗解释共2页.pdf”的压缩文件,显然提供了一份简明扼要的Java编程术语解析,旨在帮助初学者或有经验的开发者更好地理解Java开发中的关键概念。虽然压缩包中似乎还有一个名为“赚钱项目...
2. **通俗解释**: - 守护线程模式用于当一个线程等待另一个线程的执行结果时。 3. **维基百科解释**: - 在并发编程中,守护线程模式管理需要锁和前提条件的操作,延迟执行直到前提条件满足。
进程与线程的的简单解释,形象具体,通俗易懂。
《浅谈Windows中的多线程编程》文档可能以更通俗易懂的方式探讨Windows下的线程概念。它可能涵盖线程的生命周期、线程间交互的基本原理,以及处理线程安全问题的策略。文档可能会针对初学者,解释线程在日常软件开发...
子进程是通过拷贝父进程的地址空间来执行的,而线程是通过共享程序代码来执行的,讲的通俗一点就是线程的相同的代码会被执行几次。 使用线程的好处是可以节省资源,因为线程是通过共享代码的,所以没有进程调度那么...
2. **通俗解释**: - 软件中的双重检查锁定模式通过在进行更资源密集型的锁之前,以低成本方式首先检查锁状态,从而最小化昂贵的锁定操作,确保在对象初始化期间的效率和线程安全。 3. **维基百科解释**: - 在...
本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用。 什么是Handler handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过...
领导者 - 追随者模式的目的是有效地管理一组工作线程...2. **通俗解释**: - 领导者 - 追随者设计模式利用一个领导者线程在多个追随者线程之间分配工作,有效地管理任务委派、线程同步,并在并发编程中提高资源效率。
2. **通俗解释**: - 监视器模式用于强制对数据进行单线程访问。一次只允许一个线程在监视器对象内执行代码。 3. **维基百科解释**: - 在并发编程(也称为并行编程)中,监视器是一种同步构造,它允许线程具有...
2. **通俗解释**: - 可锁定对象设计模式通过锁定机制确保在多线程环境中对共享资源的安全访问,一次只允许一个线程访问该资源。 3. **维基百科解释**: - 在计算机科学中,锁或互斥量(来自互斥)是一种同步原语...
- `isThreadSafe`:是否支持多线程,默认为false。 - `info`:描述JSP页面的简短信息。 - `isErrorPage`:指示当前页面是否为错误处理页面。 - `errorPage`:指定错误页。 - `contentType`:设置响应的MIME类型...
本文将通过通俗易懂的方式解释这一概念,并探讨其背后的原理以及如何应用于实际开发。 #### 二、可见性问题产生的原因 在多线程环境中,可见性问题是由于不同线程间的数据交换和共享造成的。具体来说,当一个线程...
这套教程以其通俗易懂的语言和丰富的实例,深受广大JAVA学习者的喜爱。下面我们将深入探讨教程中的关键知识点。 1. **JAVA基础语法**:在第一天的学习中,通常会介绍JAVA的基本结构,包括如何编写第一个"Hello, ...
对于每一个技术点都给出了简单的理论解释,同时配有实例代码和‘大白话’版本的通俗解释,便于理解和掌握。 适合人群:适合所有希望深入学习 Java 核心技术的初学者、进阶开发者或是准备面试的技术人员。 使用场景及...
鸟哥通常代表着对技术有深度理解和通俗易懂的解释风格,因此这个名称可能暗示了这是一种易于理解和应用的写锁解决方案。 综上所述,"292最新写锁"是一个关于并发控制领域的进步,可能涉及到写锁的性能优化、死锁...
基于事件的异步模式允许系统处理可能需要一些时间...2. **通俗解释**: - 基于事件的异步设计模式允许任务在后台执行,并在完成时通过事件通知主程序,从而在不阻塞正在进行的操作的情况下提高系统效率和响应能力。
一、概述 在 Java 开发中,Balking 模式是一种重要的并发设计模式,它可以防止对象在不适当的状态下执行某些代码...通俗解释: 使用 Balking 模式,只有当对象处于特定状态时,某些代码才会执行。 维基百科解释: Balki