1.线程简介
世间万物都可以同时完成很多工作,例如,人体可以同时进行呼吸.血液循环。思考问题等活动,用户既可以使用计算机听歌,也可以使用它打印文件,而这些活动完全可以同时进行,这种思想放在Java中被称为并发,而将并发完成的每一件事情称为线程。
在Java中,并发机制非常重要,但并不是所有的程序语言都支持线程。在以往的程序中,多以一个任务完成后再进行下一个项目的模式进行开发。
Java语言提供了并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其它线程并发执行,这种机制被称为多线程。
多线程是非常复杂的机制,比如同时阅读3本书,首先阅读第一本书第一章,然后再阅读第二本书第一章,再阅读第三本书第一章,回过头再阅读第一本书第二章,依此类推,就体现了多线程的复杂性。
其实Java中的多线程在Windows操作系统是多任务操作系统,它以进程为单位。一个进程是一个包含有自身地址的程序,每个独立执行的程序都称为进程,也就是正在执行的程序。系统可以分配给每个进程一段有限的使用CPU的时间(也可以称为CPU时间片),CPU在这段时间中执行某个进程,然后下一个时间片又跳至另一个进程中去执行。由于CPU转换较快,所以使得每个进程好像是同时执行一样。
一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。在单线程中,程序代码按调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程。
2.实现线程的两种方式
在Java中主要提供两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。
(1)继承Thread类
Thread类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。Thread类中常用的两个构造方法如下:
public Thread(String threadName)
public Thread()
其中,第一个构造方法是创建一个名称为threadName的线程对象。
继承Thread类创建一个新的线程的语法如下:
public class ThreadTest extends Thread{}
完成线程真正功能的代码放在类的run()方法中,当一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是调用run()方法。
Thread对象需要一个任务来执行,任务是指线程在启动时执行的工作,该工作的功能代码被写在run()方法中。run()方法必须使用一下语法格式:
public void run(){
}
注意:如果start()方法调用一个已经启动的线程,系统将抛出IllegalThreadStateException异常。
当执行一个线程程序时,就自动产生一个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序就为单线程程序,主方法线程启动由Java虚拟机负责,程序员负责启动自己线程
语法如下:
public static void main(String[] args){
new ThreadTest().start();
}
下面看一个继承Thread类的实例。
在项目中创建ThreadTest类,该类继承Thread类方法创建线程。
public class ThreadTest extends Thread{
private int count=10;
public void run(){
while(true){
System.out.print(count+" ");
if(--count==0){return;
}
}
}
public static void main(String[] args){
new ThreadTest().start();
}
}
(2)实现Runnable接口
如果程序员需要继承其他类(非Theead类),而且还要使用当前类实现多线程,那么可以通过Runnable接口来实现。因为Java不支持多继承,这时该类就需要实现Runnable
接口使其具有使用线程的功能
实现Runnable接口的语法如下:
public class Thread extends Object implements Runnable
说明:实质上Thread类实现了Runnable接口,其中的run()方法正是对Runnable接口中的run()方法的具体实现
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有以下两个构造方法:
public Thread(Runnable r)。
public Thread(Runnable r,String name)。
这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。
使用Runnable接口启动新的线程的步骤如下:
(1)建立Runnable对象
(2)使用参数为Runnable对象的构造方法创建Thread实例
(3)调用start()方法启动线程。
下图表明了实现Runnable接口创建线程的流程:
例子如下:
public class llx {
private int count=10;
public llx(){
Runnable b=new Runnable(){
public void run(){
while(true){
System.out.print(count+" ");
if(--count==0){return;
}
}
}
};
new Thread(b).start();
};
public static void main(String[] args){
new llx();
}
}