1.1 概述
- 程序:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
- 进程(Porcess):是执行程序的一次执行过程,是一个动态的概念,是系统资源分配的单位。
- 线程(Thread):一个进程可以包含若干个线程,一次进程至少得有一个进程才有存在的意义。
程序执行起来叫进程,一个进程包含多个线程,如main()是主线程等等。
(操作系统中运行的程序就是进程)
总结:
1.2 线程创建
线程有三种创建方法:
1.2.1 继承Thread类
步骤:
- 自定义线程类继承Thread类
- 重写run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
示例:
//自定义线程类继承Thread类
public class PrimeThread extends Thread{
//重写run()方法,编写线程执行体
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("这个线程执行体");
}
}
//主线程
public static void main(String[] args) {
//创建线程对象
PrimeThread primeThread = new PrimeThread();
//调用start()方法启动线程
primeThread.start();
}
}
注意:
- 线程开启不一定立即执行,由CPU调度执行。
- 线程与线程之间交替执行,并非真正的同时执行。
1.2.2 实现Runnable
步骤:
- 自定义类实现Runnable接口
- 实现run()方法,编写线程执行体
- 创建Runnable接口的实现类对象
- 创建线程对象,调用start()方法启动线程
推荐使用Runnable对象,因为Java多单继承的局限性,Thread本质上也是实现Runnable
//自定义类实现Runnable接口
public class MyRunnable implements Runnable{
//重写run()方法,编写线程执行体
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("这个线程执行体");
}
}
public static void main(String[] args) {
//创建Runnable接口的实现类对象
PrimeThread primeThread = new PrimeThread();
//创建线程对象,通过线程对象开启线程(代理)
new Thread(primeThread).start();
}
}
1.2.3 两种方法对比
1.2.4 实现Callable(了解)
好处:
- 可以定义返回值
- 可以抛出异常