多线程和并行程序设计
多线程使得程序中的多个任务可以同时执行。
Java的重要功能之一就是内部支持多线程。多线程指在同一个程序中允许同时运行多个任务。在其它许多程序设计语言中,是通过调用依赖于系统的过程或者函数来实现多线程。
线程的概念
线程是指一个任务从头到尾的执行流程。一个程序可能包含多个可以同时运行的任务。
线程提供了运行一个任务的机制,对于 Java 而言,可以在一个程序中并发地启动多个线程。这些线程可以在多处理器系统上同时运行。在单处理器系统系统中,多个线程共享单个 CPU ,多个线程共享 CPU 时间称为时间分享,操作系统负责调度及分配资源给它们。注意,这里 CPU 大部分时间都是空闲的。
多线程可以使程序反应更快,交互性更强,执行效率更高。在一些情况下,即使在单处理器系上,多线程程序的运行速度也比单线程更快。Java 对多线程程序的创建和运行,以及锁定资源以避免冲突提供了非常好的支持。
可以在程序中创建附加的线程以执行并发任务。在 Java 中,每个任务都是 Runnable 接口的一个实例,也称为可运行对象(runnable object)。线程本质上讲就是便于任务执行的对象。
创建任务和线程
一个任务类必须实现 Runnable 接口。任务必须从线程运行。
任务就是对象。为了创建任务,必须首先为任务定义一个实现 Runnable 接口的类。Runnable 接口只包含一个 run 方法。需要实现这个方法告诉系统线程将如何运行。开发一个任务类的模板如下:
//Custom task class
public class TaskClass implements Runnable{
···
public TaskClass(...){
···
}
//Implement the run method in Runnable
public void run(){
//Tell system how to run custom thread
···
}
···
}
//Client class
public class Client{
···
public void someMethod(){
···
//Create an instance of TaskClass
TaskClass task = new TaskClass(...);
//Create a thread
Thread thread = new Thread(task);
//Start a thread
thread.start();
···
}
···
}
一旦定义一个 TaskClass ,就可以用它的构造方法创建一个任务。任务必须在线程中执行。Thread 类包含创建线程的构造方法以及控制线程的多种方法。创建一个任务后,可以创建该任务的线程,然后调用 start() 方法告诉 Java 虚拟机该线程准备运行。Java 虚拟机通过调用任务的 run() 方法执行任务。当 run() 方法执行完毕,线程就终止。
注意: 任务中的 run() 方法指明如何完成这个任务。Java 虚拟机会自动调用该方法,无需特意调用它。直接调用 run() 方法只是在同一个线程中执行该方法,而没有新方法被启动。
Thread 类
Thread 类包含为任务而创建的线程的构造方法,以及控制线程的方法。
public class Thread
extends Object
implements Runnable
Thread 类实现了 Runnable ,可以定义一个 Thread 的拓展类,并且实现 run 方法。然后,在客户端程序中创建这个类的一个对像,并且调用它的 start 方法来启动线程。但是,不推荐使用这种方法,这样设计会将任务和运行任务的机制混在一起,将任务从线程中分离出来是比较好的设计。
//Custom thread class
public class CustomThread extends Thread{
···
public CustomThread(...){
···
}
//Override the run method in Runnable
public void run(){
//Tell system how to perform this task
···
}
···
}
//Custom class
public class Client{
···
public void someMethod(){
···
//Create a thread
CustomThread thread1 = new CustomThread(...);
//Start a thread
thread1.start();
···
//Create another thread
CustomThread thread2 = new CustomThread(...);
//Start a thread
thread2.start();
···
}
···
}
Thread 类包含控制线程的方法:
方法 | <
---|