JAVA多线程——基础知识


此文只是对Java线程的疑问以及解答,作为学习记录,如果不对的地方也请提出。一下是我搜索的本人感觉合理的答案。

什么是操作系统?(参考互动百科)

  操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。

操作系统是干什么的?(参考互动百科)

  操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。操作系统的功能包括管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限度地发挥作用,提供各种形式的用户界面,使用户有一个好的工作环境,为其它软件的开发提供必要的服务和相应的接口等。实际上,用户是不用接触操作系统的,操作系统管理着计算机硬件资源,同时按照应用程序的资源请求分配资源,如:划分CPU时间,内存空间的开辟,调用打印机等。

CPU时间是什么?(CSDN:free365回答)

  时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法是时间片调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
  时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列等。假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。
  为了提高CPU效率,我们可以将时间片设为500毫秒。这时浪费的时间只有1%。但考虑在一个分时系统中,如果有十个交互用户几乎同时按下回车键,将发生什么情况?假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5秒钟才获得运行机会。多数用户无法忍受一条简短命令要5秒钟才能做出响应。同样的问题在一台支持多道程序的个人计算机上也会发生。

什么是进程?(借鉴:zhangdaisylove)

  我们知道操作系统最核心的概念就是进程。其实进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。

什么是线程?(借鉴:作业帮黎约将夜の246的回答)

  线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性.线程也有就绪、阻塞和运行三种基本状态. 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
  线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。

线程的好处:

  多线程可以提高多处理器机器的资源利用率,发挥多处理器的强悍功能。比如:一个双核处理器,单线程的情况下CPU的性能只能用一半。八核处理器,单线程只能用掉CPU性能的八分之一,这样造成CPU资源的极大浪费。而用多线程程序可以提高和发挥多核CPU的利用率。可以提高数据的吞吐量。多线程有很多好处,可以参考《Java 并发编程实战》这本书。

线程的风险:

  1、共享数据的安全风险。如果多线程同时操作同一个可变资源时,由于CPU的执行速度太快太快了,很难知道下一个执行的线程。因此,如果同时读取同一个资源然后进行修改,那么共享资源的值就会有误。世界就大乱了。

  2、相互等待活跃度风险。如果同一个资源被两个线程A、B获取。然而,此时资源被B线程占有,但是却一直不释放,因此A线程只能死等。如果两个线程A等待B,B等待A,那么整个世界都静止了。

  3、性能风险。一个设计不错的并发程序,多线程是能够改善性能的。但无论如何,多线程都会带来一定的程序运行时开销。当调度器(scheduler)暂时悬挂当前活跃的线程转而运行其它的线程,这时候就涉及到Context切换,在一个应用程序中多个线程会有频繁的Context切换,这就是一笔很大的开销:保存以及恢复执行的context,局部内容的丢失(loss of locality)以及CPU 把一部分精力花费在了调度线程上,而不是花费在线程的运行上。当线程们共享一个数据,那么它们就必须使用同步机制,这个机制就会造成抑制某些编译器优化,让内存中的缓存数据flush或者失效,以及增加共享内存总线(shared memory bus)上的同步流量。总之,所有的这些因素都会导致额外的性能开销。在后面的译文中我们会详细的分析这些问题,并介绍如何减少这些开销。

用户线程:

  用户创建的线程(我笑了)。

守护线程:

  Daemon的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。

  以上内容是个人对线程的疑问,已经寻找的答案。

  随着计算机技术、CPU技术的发展,多核CPU的计算机已成为趋势,所以对于多线程的编程要求将更加的多一些。接下来的随笔中,我将继续深入的探讨线程,了解线程。

以上如有不对的点,请在留言处给与指出。