您的位置:首页 > 编程语言 > Java开发

Java 多线程(一)——多线程概述

2016-03-02 21:16 295 查看

1 多线程概述

  平时我们一般编写的程序都是单线程程序,只有一条顺序执行流——程序从main()方法开始执行,一步一步向下执行直到main方法结束。这种情况,如果程序执行某行代码时遇到阻塞,那么程序将会停滞在该处。

  多线程的程序区别于单线程,即可以包含多个顺序执行流,多个顺序流之间互不干扰。打个比方:单线程的程序如同只有一个服务员的餐厅,只有做完一件事他才可以做下一件事;而多线程的程序就是有很多个服务员的餐厅,他们可以同时做很多件事情。

2 线程与进程

2.1 进程

  几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程(Process)。当一个程序运行时,内不可能包含了多个顺序执行流,每个顺序执行流就是一个线程。

  进程具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。进程的特征:

独立性:进程是系统中独立的实体,拥有自己独立的资源,拥有自己私有的地址空间。

动态性:进程是一个正在执行程序的实例,拥有自己的生命周期和各种状态。

并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。

现代操作系统都支持多进程的并发,但在具体的实现细节上可能因为硬件和操作系统的不同而采用不同的策略。比如共用式的多任务操作策略、抢占式多任务操作策略。

并发与并行

并发性(concurrency):两个或多个事件在同一时间间隔内发生。即指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行。

并行性(parallel):两个或者多个事件在同一时刻发生。即指在同一时刻,有多条指令在多个处理器上同时执行;

2.2 线程

  多线程扩展了多进程的概念,即一个进程可以同时并发(或并行)处理多个任务。

  线程(Thread)是进程的执行单元,像进程在操作系统的地位一样。一个进程可以拥有多个线程,一个线程必须有一个父进程。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有资源,它与父进程的其他线程共享该进程所拥有的全部资源。

  线程是独立运行的,它并不知道进程中是否还有其他线程存在。线程的执行时抢占式的,即当前运行的线程在任何时候都可能被挂起,以便另外一个线程可以运行。

  线程的调度和管理由进程本身完成。

2.3 小总结

  操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。

  一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少要包含一个线程(主线程,即Java中的main()方法执行后的线程)。

3 多线程的好处

3.1 为什么要多线程

在许多应用中同时发生着多种活动,其中某些活动随着时间的推移会被阻塞。通过将这些应用程序分解成可以准并行运行的多个顺序线程,程序设计模型会变得更简单。

由于线程比进程更轻量级、所以它们比进程更容易创建,也容易撤销。同时因为多个线程共享父进程里的全部资源,因此编程更加方便。

在性能方面,若多个线程都是CPU密集型(进程占用CPU时间较长)的,那么并不能获得性能上的增强,但是如果存在着大量的计算和大量的I/O处理,即I/O密集型的,那么拥有多个线程允许这些活动彼此重叠进行,从而会加快应用程序执行的速度。

3.2 多线程编程的优点

进程之间不能共享内存,但线程之间共享内存非常容易

系统创建进程时需要为该进程重新分配系统资源,但创建线程则代价小得多,因此使用多线程来实现多任务并发比多进程的效率高

Java语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程。

3.3 多线程的例子

一个浏览器能同时下载多个图片

一个web服务器能同时响应多个用户请求

Java虚拟机在后台提供了一个超级线程来进行垃圾回收

图形用户界面(GUI)应用需要启动单独的线程从主机环境收集用户界面事件

……

4 进程或线程的调度

  当计算机系统是多道程序设计系统时,通常就会有多个进程或线程同时竞争CPU。只要有两个或多个的进程处于就绪状态,这种情形就会发生。如果只有一个CPU可用,那么久必须选择下一个要运行的进程。操作系统中完成这一部分的是调度程序(scheduler),该程序使用的算法是调度算法(scheduling algorithm)。

4.1 调度算法

不同的环境需要不同的调度算法。

批处理系统中的调度

先来先服务(first-come-first-served)

非抢占式的先来先服务算法。

最短作业优先(shortest job first)

非抢占式

只有在所有的作业都可同时运行的情况下,最短作业优先算法才是最优化的。

最短剩余时间优先(shortest remaining time next)

最短作业优先的抢占式版本是最短剩余时间优先。

交互式系统中的调度

轮转调度(Round-robin)

优先级调度(Priority scheduling)

多级队列和多级反馈队列(Multi Queue & Multi-level Feedback)

Guaranteed Scheduling, Lottery Scheduling, and Fair Sharing Scheduling

实时系统中的调度

静态调度

动态调度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: