又是新的一周,今天讲的是第十三章多线程,在OS里,进程是资源分配的最小单位,线程是cpu调度的最小单位,每个独立运行的程序称为一个进程(Process)。在一个程序内部也可以实现多个任务并发执行,其中每个任务称为线程。
多线程的优势:
1、提高界面程序的响应速度,可以将需要大量时间完成的流程在后台完成。
2、充分利用系统资源。
在实现线程编程时,首先需要让一个类具备多线程的能力(继承Thread类或实现Runnable接口的类具备多线程的能力),然后创建线程对象,调用对应的启动线程方法,既可实现多线程编程。
在实际实现线程时,JAVA提供了3种实现方式:1、继承Thread类;2、实现Runnable接口;3、使用了Timer和TimerTask组合。
1、继承Thread
创建: A extends Thread
在A中实现run()
启动:利用继承自Thread 的strart() 方法
A a = new A();
a.start();
一个类具备了多线程的能力以后,可以在程序中需要的位置启动线程,而不仅仅是在main方法内部启动。
2、实现Runnable接口
创建: A implements Runnable
在A中实现run()
启动: 以A的对象为Thread的构造函数的参数创建Thread对象
并且利用它的start()方法调度启动线程
A a = new A();
Thread b = new Thread(a);
b.start();
3、利用Timer和 TimerTask组合
创建:创建TimerTask的子类,并实现run()方法得到时钟器任务类
MyTimerTask extends TimerTask{
public void run(){
}
}
启动:创建时钟器Timer对象
利用时钟器对象的schedule()方法启动线程任务
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), ....,...);
在实际使用时,一个Timer可以启动任意多个TimerTask实现的线程,但是多个线程之间会存在阻塞。因此,如果多个线程之间需要完全独立运行,最好还是一个Timer启动一个TimerTask实现的线程。
Timer类中4个互为重载的schedule方法:
1、public void schedule(TimerTask task,Date time):该方法的作用是在到达time指定的时间或已经超过该时间时执行线程task。
Date d=new Date(2009-1900,10-1,1,10,0,0);
t.schedule(task,d); //在时间达到d或超过d(如2009年10月2号)时,启动线程task
2、Public void schedule(TimerTask task,Date firstTime,long period):该方法的作用是在时间到达firstTime时开始,每隔period毫秒就启动一次task指定的线程。这种方法会重复启动线程。
Date d=new Date(2009-1900,10-1,1,10,0,0);
t.schedule(task,d,20000); //当时间达到或超过d后每隔20000毫秒启动一次线程task
3、Public void schedule(TimerTask task,long delay):该方法和第一个方法类似,作用是在执行schedule方法delay毫秒后启动线程task。
T.schedule(tadk,1000); //在执行该行启动代码1000毫秒后启动一次线程task
4、Public void schedule(TimerTask task,long delay,long period):该方法和第二个方法类似。