基础知识
1. 什么是计算机程序
计算机程序是运行于电子计算机上的一组计算机能识别和执行的指令序列。通常储存于硬盘。
2. 什么是进程
进程是正在运行的程序的实例。通常,进程需要使用的硬件有 CPU(含寄存器)、内存等。
3. 什么是线程
线程是程序执行指令的最小单元。进程是线程的容器。
同一个进程中的不同线程可以同时运行。
通常的 CPU 只能同时处理几个或者十几个线程。然而,实际上,一台计算机中会同时有数千个线程。CPU 在极短的时间内,快速地执行不同线程并切换,给人一种“计算机能同时执行数千线程”的错觉。
用 JAVA 写成的程序在运行时,JVM 会为程序创建一个线程来执行主方法。
4. 多线程有什么用
多线程程序可以高效地运行,同时处理多项任务,充分利用硬件资源。
线程的切换会带来时间和内存空间的花销。因此,一个进程中的线程不是越多越好。
线程的创建与启动
1. 线程的创建
在 JAVA 中,一个线程是一个对象。它可以是 java.lang.Thread 类或其子类的对象。Thread 类是 java.lang.Runnable 接口的实现。Runnable 接口中有 run 方法。Thread 类中有 start 方法。JVM 启动线程后,新线程会执行其 run 方法。
创建新的线程有两种方法:
- 将类声明为 Thread 类的子类,并重写 run 方法。
class Sample1 extends Thread {
//...
public void run(){
//code
}
}
- 将类声明为 Runnable 的实现,并重写 run 方法。
class Sample2 implements Runnable {
//...
public void run() {
//code
}
}
2. 线程的启动
Thread 类中有 start 方法。调用 Thread 对象的 start 方法就可以启动线程并使其执行 run 方法。
Runnable 接口中没有 start 方法。要启动由 Runnable 实现的线程对象,应该利用该对象实例化一个 Thread 对象,再调用 Thread 对象的 start 方法。
(new Sample1).start();
(new Thread(new Sample2)).start();
JAVA 中不允许多继承。因此,如果要将某类的子类的对象作为线程时,只能采用第二种方法。
当一个线程正在运行时,不能再次调用其 start 方法。否则会引发 IllegalThreadStateException 异常。
可以直接调用线程对象的 run 方法,但这样不能创建新线程,run 方法将在原有线程中执行。
当 run 方法执行完毕时,一个线程就运行结束了。要使线程不停地运行,可以在 run 方法中使用永真循环。
Thread.sleep 方法
Thread 类中有静态方法sleep。它可以使当前线程进入阻塞状态,即暂时停止运行,然后,在一段时间后继续运行。
它有两个版本,可以分别让当前线程暂时停止运行,然后在 m 毫秒或者 m 毫秒 n 纳秒后继续运行。
sleep 方法可能会抛出 InterruptedException 异常。
long m;
int n;
try {
Thread.sleep(m);
Thread.sleep(m, n);
} catch (InterruptedException e) {
e.printStackTrace();
}