随着计算机技术的发展编程模型也越来越复杂多样化但多线程编程模型是目前计算机系统架构的最终模型随着CPU主频的不断攀升X架构的硬件已经成为瓶在这种架构的CPU主频最高为G事实上目前G主频的CPU已经接近了顶峰
如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能)那么继续提高CPU性能的方法就是超线程CPU模式那么作业系统应用程序要发挥CPU的最大性能就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序
所以掌握多线程编程模型不仅是目前提高应用性能的手段更是下一代编程模型的核心思想多线程编程的目的就是最大限度地利用CPU资源当某一线程的处理不需要占用CPU而只和I/OOEMBIOS等资源打交道时让需要占用CPU资源的其它线程有机会获得CPU资源从根本上说这就是多线程编程的最终目的
第一需要弄清的问题
如同程序和进程的区别要掌握多线程编程第一要弄清的问题是线程对象和线程的区别
线程对象是可以产生线程的对象比如在java平台中Thread对象Runnable对象线程是指正在执行的一个指点令序列在java平台上是指从一个线程对象的start()开始运行run方法体中的那一段相对独立的过程
鑒于作者的水平无法用更确切的词汇来描述它们的定义但这两个有本质区别的概念请初学者细细体会随着介绍的深入和例程分析的增加就会慢慢明白它们所代表的真实含义
天下难事必始于易天下大事必始于细
让我们先从最简单的单线程来入手()带引号说明只是相对而言的单线程()基于java
class BeginClass{
public static void main(String[] args){
for(int i=;i<;i++)
Systemoutprintln(HelloWorld!);
}
}
如果我们成功编译了该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(){
Systemoutprintln(Thread say:HelloWorld!);
}
}
public class MoreThreads{
public static void main(String[] args){
new MyThread();
new MyThread()start();
Systemoutprintln(Main say:HelloWorld);
}
}
执行这个程序main方法第一行产生了一个线程对象但并没有线程启动
main方法第二行产生了一个线程对象并启动了一个线程
main方法第三行产生并启动一个线程后主线程自己也继续执行其它语句
我们先不研究Thread对象的具体内容稍微来回想一下上面的两个概念线程对象和线程在JAVA中线程对象是JVM产生的一个普通的Object子类而线程是CPU分配给这个对象的一个运行过程我们说的这个线程在干什么不是说一个线程对象在干什么而是这个运行过程在干什么如果一时想不明白不要急但你要记得它们不是一回事就行了