`
j小虫
  • 浏览: 18485 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java多线程简介

阅读更多

一、线程概述

线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中, 必须至少建立一个线程(这个线程被称为主线程)来作为这个程序运行的入口点。因此,在操作系统中运行的任何程序都至少有一个主线程。

线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进 程中,必须至少建立一个线程(这个线程被称为主线程)来作为这个程序运行的入口点。因此,在操作系统中运行的任何程序都至少有一个主线程。

进程和线程是现代操作系统中两个必不可少的运行模型。在操作系统中可以有多个进程,这些进程包括系统进程(由操作系统内部建立的进程)和用户进程 (由用户程序建立的进程);一个进程中可以有一个或多个线程。进程和进程之间不共享内存,也就是说系统中的进程是在各自独立的内存空间中运行的。而一个进 程中的线可以共享系统分派给这个进程的内存空间。

线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈, 是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。

注意:任何一个线程在建立时都会执行一个函数,这个函数叫做线程执行函数。也可以将这个函数看做线程的入口点(类似于程序中的main函数)。无论 使用什么语言或技术来建立线程,都必须执行这个函数(这个函数的表现形式可能不一样,但都会有一个这样的函数)。如在Windows中用于建立线程的 API函数CreateThread的第三个参数就是这个执行函数的指针。

在操作系统将进程分成多个线程后,这些线程可以在操作系统的管理下并发执行,从而大大提高了程序的运行效率。虽然线程的执行从宏观上看是多个线程同 时执行,但实际上这只是操作系统的障眼法。由于一块CPU同时只能执行一条指令,因此,在拥有一块CPU的计算机上不可能同时执行两个任务。而操作系统为 了能提高程序的运行效率,在一个线程空闲时会撤下这个线程,并且会让其他的线程来执行,这种方式叫做线程调度。我们之所以从表面上看是多个线程同时执行, 是因为不同线程之间切换的时间非常短,而且在一般情况下切换非常频繁。假设我们有线程A和B。在运行时,可能是A执行了1毫秒后,切换到B后,B又执行了 1毫秒,然后又切换到了A,A又执行1毫秒。由于1毫秒的时间对于普通人来说是很难感知的,因此,从表面看上去就象A和B同时执行一样,但实际上A和B是 交替执行的。

二、线程给我们带来的好处

如果能合理地使用线程,将会减少开发和维护成本,甚至可以改善复杂应用程序的性能。如在GUI应用程序中,还以通过线程的异步特性来更好地处理事 件;在应用服务器程序中可以通过建立多个线程来处理客户端的请求。线程甚至还可以简化虚拟机的实现,如Java虚拟机(JVM)的垃圾回收器 (garbage collector)通常运行在一个或多个线程中。因此,使用线程将会从以下五个方面来改善我们的应用程序:

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)中都使用了一个单独的事件分派线程(event dispatch thread,EDT)来对GUI事件进行扫描。当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。由于EDT的任务只是对GUI 事件进行扫描,因此,这种方式对事件的反映是非常快的。

5.   节约成本

提高程序的执行效率一般有三种方法:

(1)增加计算机的CPU个数。

(2)为一个程序启动多个进程

(3)在程序中使用多进程。

第一种方法是最容易做到的,但同时也是最昂贵的。这种方法不需要修改程序,从理论上说,任何程序都可以使用这种方法来提高执行效率。第二种方法虽然 不用购买新的硬件,但这种方式不容易共享数据,如果这个程序要完成的任务需要必须要共享数据的话,这种方式就不太方便,而且启动多个线程会消耗大量的系统 资源。第三种方法恰好弥补了第一种方法的缺点,而又继承了它们的优点。也就是说,既不需要购买CPU,也不会因为启太多的线程而占用大量的系统资源(在默 认情况下,一个线程所占的内存空间要远比一个进程所占的内存空间小得多),并且多线程可以模拟多块CPU的运行方式,因此,使用多线程是提高程序执行效率 的最廉价的方式。

三、Java的线程模型

由于Java是纯面向对象语言,因此,Java的线程模型也是面向对象的。Java通过Thread类将线程所必须的功能都封装了起来。要想建立一 个线程,必须要有一个线程执行函数,这个线程执行函数对应Thread类的run方法。Thread类还有一个start方法,这个方法负责建立线程,相 当于调用Windows的建立线程函数CreateThread。当调用start方法后,如果线程建立成功,并自动调用Thread类的run方法。因 此,任何继承Thread的Java类都可以通过Thread类的start方法来建立线程。如果想运行自己的线程执行函数,那就要覆盖Thread类的 run方法。

在Java的线程模型中除了Thread类,还有一个标识某个Java类是否可作为线程类的接口Runnable,这个接口只有一个抽象方法 run,也就是Java线程模型的线程执行函数。因此,一个线程类的唯一标准就是这个类是否实现了Runnable接口的run方法,也就是说,拥有线程 执行函数的类就是线程类。

从上面可以看出,在Java中建立线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口,并通过Thread和实现 Runnable的类来建立线程,其实这两种方法从本质上说是一种方法,即都是通过Thread类来建立线程,并运行run方法的。但它们的大区别是通过 继承Thread类来建立线程,虽然在实现起来更容易,但由于Java不支持多继承,因此,这个线程类如果继承了Thread,就不能再继承其他的类了, 因此,Java线程模型提供了通过实现Runnable接口的方法来建立线程,这样线程类可以在必要的时候继承和业务有关的类,而不是Thread类。

分享到:
评论

相关推荐

    .2.【方法1】隐藏的弦图 (1)【课程出自拼多多店铺:北大网课资料店】

    .2.【方法1】隐藏的弦图 (1)【课程出自拼多多店铺:北大网课资料店】

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5781.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5781.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5781.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    毕业设计参考-本科毕设时做的遥感影像分类

    毕业设计参考-本科毕设时做的遥感影像分类 本科毕业设计中的遥感影像分类是一个涉及遥感技术、图像处理和机器学习等多个领域的项目。遥感影像分类是通过计算机技术对遥感图像中的不同地物进行识别和分类的过程。以下是一个基于遥感影像分类的本科毕业设计建议: ### 1. 需求分析 - **用户角色**:确定系统的主要用户角色,如遥感影像分析人员、决策支持者等。 - **核心功能**: - 遥感影像预处理:包括影像的校正、裁剪、增强等。 - 特征提取:从遥感影像中提取有助于分类的特征。 - 分类算法实现:实现一种或多种分类算法,如监督学习、无监督学习、深度学习等。 - 结果评估:评估分类结果的准确性和可靠性。 ### 2. 技术选型 - **遥感影像处理**:使用ENVI、ERDAS Imagine等遥感影像处理软件。 - **编程语言**:Python(TensorFlow、Keras、PyTorch等)。 - **数据库**:MySQL、Oracle或PostgreSQL等。 - **服务器**:Tomcat或Jetty。 - **开发工具**:Eclipse、IntelliJ

    2024年箱包皮具行业分析报告.pptx

    行业报告

    VUE + nodejs实战

    VUE + nodejs实战

    某三层流水别墅建筑施工图水电图2g-qd-pm.dwg

    某三层流水别墅建筑施工图水电图2g-qd-pm.dwg

    2024嵌入式面试资料通用程序员简历模板700M

    2024嵌入式面试资料通用程序员简历模板700M提取方式是百度网盘分享地址

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5790.170)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5790.170 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5790.170 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    2024最新Simple Allow Copy中文版

    2024最新Simple Allow Copy中文版

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5767.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5767.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5767.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    Linux 平台下基于 Rust + GTK 开发的音乐播放器

    Linux 平台下基于 Rust + GTK 开发的音乐播放器

    毕业设计-毕设:一个血压实时监控app

    毕设:一个血压实时监控app,该app主要功能为与测量设备进行通信,获取测量数据并在客户端进行处理,由服务器进行数据 分析,为用户提供健康评估及建议。 目标 实现与蓝牙设备通信,获取使用者的心率数据和血压数据 实现数据可视化 实现将数据上传到服务器,并进行进一步分析 实现其它辅助性功能:个人信息,设置等 在完成上述功能之后,可以进一步实现其它功能,例如测量光照,温度,振动等数据 已完成功能 蓝牙功能 可以打开蓝牙并连接到指定设备获取数据流。 数据图表 已完成图表UI设计以及模块功能搭建,已实现图表数据的数据库读取功能。 个人设置 已搭建好UI,完成个人信息页面全部功能。已完成全部网络通信接口。 搭建好数据库模块以及网络通信模块 数据库功能已经实现并抽象,网络通信功能也已实现并抽象,服务器初步搭建了框架。 服务器和客户端已完成了关于User数据 和测量数据的上传下载以及清空等一系列操作,本机已通过花生壳映射到外网作为测试服务器。 服务器已有比较简单的UI可供查 询指定用户的测量数据。 状态计算 根据监控数据(振动,屏幕控制)计算用户状态,客户端算法已初步完成。 一些附加功能 已完成监听加

    基于SSM+Mysql的在线投票系统(源码+需求分析+演示视频).zip

    java语言,ssm框架,mysql数据库 前台+后台 前台界面 WU 后台界面:CQA+CQB 内容页 P2 前台 投票须知(固定IP不可重复投票) 用户注册 用户可以发起投票(包括题目,选项,单选/多选等都可以自定义) 投票主题查看,可以收藏 在线投票(按照主题投票)登录后可以操作,支持单选及多选,投票结果查看,统计(图表形式) 查看投票结果,登录后可以操作 在线留言(包括留言和管理员回复) 后台 管理员 管理员管理 注册用户审核 投票须知管理 投票主题管理 投票内容管理(选项的删除和添加) 系统管理(可以实现项目的删除和编辑以及系统配置的更新) 注册用户 个人资料修改 我的收藏主题

    鸿蒙座舱:人车交互新生态

    鸿蒙座舱:人车交互新生态 ——华为产业链深度系列研究

    2024嵌入式面试资料嵌入式八股文和相关知识

    2024嵌入式面试资料嵌入式八股文和相关知识提取方式是百度网盘分享地址

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5785.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5785.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5785.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    docker run -d -name redis-exporter \ -p 9121:9121 oliver006/red

    docker run -d --name redis_exporter \ -p 9121:9121 oliver006/redis_exporter:v1.45.0 \ --redis.addr redis://192.168.1.108:6379 \ --redis.password ""

    毕业设计-基于事理图谱的事件推理系统-python

    毕业设计-基于事理图谱的事件推理系统 基于事理图谱的事件推理系统 该项目主要实现的是基于事理图谱的事件推理系统,内容包括事件关系提取、事件提取以及事理图谱的构建,同时附有获得网易 新闻内容的网络爬虫。 项目使用了LTP(语言技术平台)的自然语言处理组件和腾讯AI Lab发布测中文词向量数据来构建事件提取和事件向量化内容。 文件结构 ● /Crawler:包括了网络爬虫代码 ● /NLP:包括了自然语言处理代码,有事件关系提取、事件提取以及LTP组件的代码 ● /EventAbstract:包括了事件向量化和事件抽象的代码,其中实现了K-mean++算法 ● /IO:包括了数据库操作和连接各个模块输入输出的代码,核心内容是事理图谱的可视化显示 ● /Data:包括了上述模块运行时的输出,以及一些测试的文本文件 该项目于2020.04.21开始着手编写,于2020.05.30完成其主要功能,即对自然语言文本的事理图谱的构建和展示。

    2024年双酚A行业分析报告.pptx

    行业报告

    2024嵌入式大厂面经朝歌宽带笔试题

    2024嵌入式大厂面经朝歌宽带笔试题提取方式是百度网盘分享地址

Global site tag (gtag.js) - Google Analytics