- 程序是一个静态的概念。
- 进程是程序的一次执行过程,动态的。是系统资源分配的单位。
- 一个进程可以包含若干个线程,线程是CPU调度和执行的单位。是独立的执行路径。
在只有一个CPU的前提下,同一个时间点,CPU只能执行一个代码,因为切换速度快,所以会出现同时执行的错觉。
线程不一定立即执行,由CPU调度。
创建线程的多种方法
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
1.继承Thread类
/**
* 1. 继承Thread类 -> 重写run方法
*
*/
class Thread1 extends Thread {
@Override
public void run() {
System.out.println("1. 继承Thread类 -> 重写run方法:" + this.getName());
}
}
// 启动线程
// 1. 继承Thread类
Thread thread1 = new Thread1();
thread1.start();
// 或者
// Thread1 tt = new Thread1();
// tt.start();
2.实现Runnable方法
避免单继承局限性
/**
* 2. 实现Runnable接口 -> 重写run方法
*/
class Thread2 implements Runnable {
@Override
public void run() {
System.out.println("2. 实现Runnable接口 -> 重写run方法:" + Thread.currentThread().getName());
}
}
// 2. 实现Runnable接口
Thread2 runnable = new Thread2();
Thread thread2 = new Thread(runnable);
thread2.start();
3.实现Callable接口
需要返回值类型
重写call(), 需要抛出异常
/**
* 3. 实现Callable接口 -> 重写call方法
*/
class Thread3 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("3. 实现Callable接口 -> 重写call方法:" + Thread.currentThread().getName());
return "call()返回参数";
}
}
// 3. 实现Callable接口
FutureTask<String> futureTask = new FutureTask<>(new Thread3());
new Thread(futureTask).start();
// 需捕获异常
System.out.println(futureTask.get());