线程的基本介绍

来源:互联网 发布:js获取标签name值 编辑:程序博客网 时间:2024/06/05 20:46

如果一次只完成一件事情,很容易实现,但事实上世间有很多事情都是同时进行的,所以在Java中为了模拟这种状态,引入了线程机制。简单的说,当程序同时完成多件事情时,就是所谓的多线程程序。

    世间万物会同时完成多很多工作,如人体同时进行呼吸、血液循环、思考问题等活动,用户既可以使用计算机听歌,也可以用它来打印文件,而这些活动完全可以同时进行,这种思想在Java中被称为并发,而将并发完成的每一件事称为线程。    在人们的生活中,并发机制非常重要,但并不是所有的语言都支持线程。在以往的程序中,多以一个任务完成后再进行下一个项目的模式进行开发,这样下一个任务的开始必须等待前一个任务的结束。Java语言提供并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制被称为多线程。

线程在windows操作系统中的执行顺序

一个线程是进程中的执行流程,一个进程可以同时包含多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。在单线程中,程序代码按调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程。

Java 提供了一套内置机制,用以支持多个被称为“线程”的并发子任务。这些线程均在单一的程序内运行。(除非你的机器里安装了多个处理器,否则这将是多子任务的唯一形式)尽管任何地方都可以应用线程,但它大多是被应用于打算创建一个反应灵敏的用户界面的情况,举例来说,虽然有一些别的任务正在执行,但用户仍然可以毫无阻碍地按下按钮或者输入数据。

在计算机编程中有一个基本概念,就是在同一时刻处理多个任务(task)的思想。许多程序设计问题都需要程序能够停下正在做的工作,转而处理某个其它问题,然后再返回主进程(main process)。有许多方法可以实现这个目的。最初,程序员们用所掌握的有关机器底层的知识来编写中断服务程序(interrupt service routine),主进程的挂起(supension)是通过硬件终端来触发的。尽管这么做可以解决问题,但是其难度太大,而且不能够移植,所以使得将程序移植到新型号的机器上时,既费时又费力。有时中断对于处理时间临界(time-critical)的任务是必需的,但是对于大量的其它问题,我们只是想把问题切分成多个可独立运行的部分,从而提高程序的响应能力。在程序中,这些彼此独立运行的部分称之为线程(thread),上述概念被称为“并发(concurrency)”或“多线程(multithreading)”。多线程最常见的例子就是用户界面。通过使用线程,用户可以在按下按钮后快速得到一个响应,而不用强制等待直到程序完成当前任务为止。

通常,线程只是一种为单一处理器分配执行时间的手段。但是如果操作系统支持多处理器,那么每个线程都可以被指派给不同的处理器,并且它们是在真正地并行执行。在语言级别上多线程所带来的便利之一便是程序员不用再操心机器上有多个处理器还是只有一个处理器。由于程序被逻辑化分为线程,所以如果机器拥有多个处理器,那么程序将在不需要特殊调整的情况下执行得更快。

所有这些都使得线程看起来相当简单,但是有一个隐患:共享资源。如果有超过一个的并行线程都要访问同一项资源,那么就会出问题。例如,两个进程不能同时向一台打印机发送信息。为了解决这个问题,可以共享的资源,例如打印机,必须在被使用期间锁定。因此,整个过程是;某个线程锁定某项资源,完成其任务,然后释放资源锁,使其它线程可以使用这项资源。

Java 的线程机制是内置于其中的,它使此复杂课题变得简单得多了。线程机制被对象层次所支持,因此线程的执行可以用对象来表示。Java 同时也提供了限制性资源锁定功能,它可以锁定任何对象所占用的内存(毕竟这也算是某种共享资源),使得同一时刻只能有一个线程在使用它。这是通过 synchronized 关键字来实现的。其它类型的资源必须由程序员显式地锁定,通常是通过创建一个表示锁的对象,所有线程在访问资源之前先检查这个对象。

原创粉丝点击