基础篇 (一)
[写在前面]
随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型是目前计算机
系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最
高为4G.事实上目前3.6G主频的CPU已经接近了顶峰.
如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么继续提高CPU
性能的方法就是超线程CPU模式.
那么,作业系统,应用程序要发挥CPU的最大性能,就是要改变到以多线程编程模型为主的并
行处理系统和并发式应用程序.
所以,掌握多线程编程模型,不仅是目前提高应用性能的手段,更是下一代编程模型的核心
思想.
多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只
和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源.从根本上说,这就是多
线程编程的最终目的.
[第一需要弄清的问题]
如同程序和进程的区别,要掌握多线程编程,第一要弄清的问题是:线程对象和线程的区别.
线程对象是可以产生线程的对象.比如在java平台中Thread对象,Runnable对象.
线程,是指正在执行的一个指令序列.在java平台上是指从一个线程对象的start()开始.
运行run方法体中的那一段相对独立的过程.
鉴于作者的水平,无法用更确切的词汇来描述它们的定义.但这两个有本质区别的概念请初
学者细细体会,随着介绍的深入和例程分析的增加,就会慢慢明白它们所代表的真实含义.
天下难事必始于易,天下大事必始于细.
让我们先从最简单的"单线程"来入手.(1)带引号说明只是相对而言的单线程.(2)基于java
class BeginClass{
public static void main(String[] args){
for(int i=0;i<100;i++)
System.out.println("Hello,World!");
}
}
如果我们成功编译了该java文件,然后在命令行上敲入:
java BeginClass
现在发生了什么呢?每一个java程序员,从他开始学习java的第一分钟里都会接触到这个问
题,但是,你知道它到底发生发什么?
JVM进程被启动,在同一个JVM进程中,有且只有一个进程,就是它自己.然后在这个JVM环境中,
所有程序的运行都是以线程来运行.JVM最先会产生一个主线程,由它来运行指定程序的入口点.在这个
程序中,就是主线程从main方法开始运行.当main方法结束后,主线程运行完成.JVM进程也随之退出.
我们看到的是一个主线程在运行main方法,这样的只有一个线程执行程序逻辑的流程我们称
之为单线程.这是JVM提供给我们的单线程环境,事实上,JVM底层还至少有垃圾回收这样的后台线程以
及其它非java线程,但这些线程结我们而言不可访问,我们只认为它是单线程的.
主线程是JVM自己启动的,在这里它不是从线程对象产生的.在这个线程中,它运行了main方法
这个指令序列.理解它,但它没有更多可以研究的内容.
[接触多线程]
class MyThread extends Thread{
public void run(){
System.out.println("Thread say:Hello,World!");
}
}
public class MoreThreads{
public static void main(String[] args){
new MyThread();
new MyThread().start();
System.out.println("Main say:Hello,World");
}
}
执行这个程序,main方法第一行产生了一个线程对象,但并没有线程启动.
main方法第二行产生了一个线程对象,并启动了一个线程.
main方法第三行,产生并启动一个线程后,主线程自己也继续执行其它语句.
我们先不研究Thread对象的具体内容,稍微来回想一下上面的两个概念,线程对象和线程.
在JAVA中,线程对象是JVM产生的一个普通的Object子类.
而线程是CPU分配给这个对象的一个运行过程.我们说的这个线程在干什么,不是说一个线
程对象在干什么,而是这个运行过程在干什么.如果一时想不明白,不要急,但你要记得它们不是一回
事就行了.
累了吧?为不么不继续了?
基于这种风格来介绍多线程,并不是每个人都喜欢和接受的,如果你不喜欢,正好不浪费你的
时间了,而如果你接受的话,那就看下一节吧.