- 1、本文档共46页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
黑马程序员——Java多线程
一、什么是多线程?
要想明白什么是多线程,就得先理解线程。而要理解线程,就需要学习进程,下面将分别讲解进程、线程的概念,最后引出多线程的概念。
1.进程
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
通俗的理解,进程就是一个正在执行的程序,每个进程都存在一个执行顺序,该执行顺序也称执行路径或执行单元。
2.线程
线程是进程内一个相对独立的、可调度的执行单元。线程在控制着进程的执行,只要进程中有一个线程在执行,进程就不会结束。一个进程中至少存在一个线程。
3.多线程
了解了线程的概念,就不能理解多线程了。当在单个程序中同时运行多个线程以完成不同任务的工作方式,就称为多线程。
例如,在java虚拟机运行时会启动一个java.exe的执行程序,该正在运行的执行程序就叫进程。该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中,该线程被称之为主线程。但JVM运行时并不是只启动一个主线程,还有负责垃圾回收机制的线程。像这种在一个进程中有多个线程同时执行的方式,就可以理解为多线程。
二、多线程有哪些作用?
1.充分利用CPU资源
现在世界上大多数计算机只有一块CPU。因此,充分利用CPU资源显得尤为重要。当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。这将造成大量的计算资源的浪费。而在程序中使用多线程可以在某一个线程处于休眠或阻塞时,而CPU又恰好处于空闲状态时来运行其他的线程。这样CPU就很难有空闲的时候。因此,CPU资源就得到了充分地利用。
2.简化编程模型
如果程序只完成一项任务,那只要写一个单线程的程序,并且按着执行这个任务的步骤编写代码即可。但要完成多项任务,如果还使用单线程的话,那就得在在程序中判断每项任务是否应该执行以及什么时候执行。如显示一个时钟的时、分、秒三个指针。使用单线程就得在循环中逐一判断这三个指针的转动时间和角度。如果使用三个线程分另来处理这三个指针的显示,那么对于每个线程来说就是指行一个单独的任务。这样有助于开发人员对程序的理解和维护。
3.简化异步事件的处理
当一个服务器应用程序在接收不同的客户端连接时最简单地处理方法就是为每一个客户端连接建立一个线程。然后监听线程仍然负责监听来自客户端的请求。如果这种应用程序采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的数据,在读完数据后,read方法处于阻塞状态,也就是说,这个线程将无法再监听客户端请求了。而要想在单线程中处理多个客户端请求,就必须使用非阻塞的Socket连接和异步I/O.但使用异步I/O方式比使用同步I/O更难以控制,也更容易出错。因此,使用多线程和同步I/O可以更容易地处理类似于多请求的异步事件。
4.使GUI更有效率
使用单线程来处理GUI事件时,必须使用循环来对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还得来执行其他的程序代码。如果这些代码太长,那么GUI事件就会被“冻结”,直到这些代码被执行完为止。在现代的GUI框架(如SWING、AWT和SWT)中都使用了一个单独的事件分派线程(EDT)来对GUI事件进行扫描。当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。由于EDT的任务只是对GUI事件进行扫描,因此,这种方式对事件的反映是非常快的。
三、创建线程
通过查找API文档,发现能够建立线程的类只有Thread类,但是创建线程有两种方式:
1.继承Thread类
由于Thread类能够直接建立线程,也就是说Thread类里有建立线程的方法,因此可通过继承Thread类即可获取创建线程的方法。创建线程的步骤如下:
a)自定义一个类并继承Thread类。
b)复写Thread类的run()方法。目的:run()方法是存放所创建线程要执行的代码,类似main()函数,如果需要自定义运行代码,那么就必须覆盖Thread类的run()方法。
c)通过new的方式创建自定义线程类的具体实例对象,这样才真正建立了一个线程。
d)调用该对象的start()方法,以启动线程。目的:让线程运行起来,并执行run()方法中的代码。
注:不可直接直接调用run()方法,否则线
您可能关注的文档
- (管理制度)选聘管理制度.docx
- 初中数学《轴对称图形》说课稿.docx
- 2025-2030年农业物联网病虫害预警行业深度调研及发展战略咨询报告.docx
- 公关策划公关营销结课作业.docx
- 机械工程、机电一体化.docx
- 机电技术应用人才培养方案.docx
- 机械能守恒定律同步练习.docx
- 万全生命健康医疗项目可行性研究报告.docx
- 积极发挥造价工程师在施工过程中的签证作用.docx
- 2020年学校教科研工作心得体会感悟_1.docx
- 一城一云服务城市高质量发展白皮书(2023).pdf
- 中国连锁餐饮企业资本之路系列报告(2023)-历尽千帆,厚积薄发.pdf
- 有色金属行业专题研究:未来焦点,钒液流电池储能风潮兴涌.pdf
- 中国 “一带一路”实践与观察报告.pdf
- 医药生物-消费器械行业2023年中报总结:积极拥抱高璧垒高成长(202309).pdf
- DB50T 699-2016 简易升降机检验规则.pdf
- DB50T 746-2016 水库大坝安全监测资料整编分析规程 .pdf
- 看DAO2025-未尽研究报告(2024).pdf
- 市场洞察力报告-数据安全检查工具箱(2024).pdf
- 2024年预见未来:中国元医院建设发展调研报告.pdf
文档评论(0)