Java多线程学习之多线程的概念及意义

时间:2022-12-26 15:38:36

  Java的线程机制,则是由执行程序表示的单一进程创建的任务(拗口!),注意,是在单一进程里面创建多个任务,不同于操作系统分叉外部进程。由于所有的任务在同一个进程内,任务之间会相互干涉(例如操作同样的对象,内存)。这些独立的任务则是由执行线程来驱动,一个线程就是在进程中的一个单一的顺序控制流。Java的线程机制是对操作系统透明的,线程不需要知道底层CPU是单核还是多核。线程通过切分CPU时间来获得并发执行,需要消耗上下文切换(但是与进程切换相比要小很多)。

  总结:Java运行的单一进程创建许多独立的任务,而每一个任务都需要在一个线程上执行,以实现进程的多任务。

  为何要创建多任务?这个问题等价于为何要使用并发编程。一个用户经常使用的程序,一般都会有诸如关闭按钮,随时响应用户输入,并且不断有可视化图形界面输出,试想如果没有并发编程(即是没有多任务)的情况下,进程只有一个任务在运行,假设是等待输入。进程在等待用户输入的时候,进入IO阻塞,这时候,图形界面静止了,也没法关闭进程(因为在等待用户输入,所有CPU时间都用在等待上面,无法响应关闭事件)。有了并发编程(即允许进程创建多个任务,这里3个任务就够了:等待用户输入、等待关闭操作和输入图形界面),这些任务都能被分配到一定的CPU时间片,形象的说就是大家都有机会来执行(分配机制取决于运行的系统),这样,即是等待用户输入任务进入了IO阻塞,CPU可以切换到其余两个任务(注意CPU同一时间内只能执行一个任务,但是因为切换,看起来像是并发执行多个任务),这样界面一样有输出,关闭操作也得到响应,而当用户真的进行了输入,等待用户输入任务还是可以响应用户输入(需要注意的是,这个响应用户输入并不是即时的,因为输入发生时CPU不一定在执行等待用户输入任务,不过线程的调度机制可以确保得到响应)。

  与线程一起被提及的另一个概念是进程,进程是运行在它自己的地址空间内的自包容的程序(不了解~~~~(>_<)~~~~)。操作系统层次的并发方式就是进程(一个操作系统上面同时运行多个程序,在单核处理器上,其实也是通过周期性切换CPU从一个进程到另一个进程实现“并发”,不过进程之间相互隔离,不用相互通信,不会彼此互相干涉)。因为进程相对是封闭的,所以并发编程较线程容易。