线程的概念
核心概念
- 线程就是独立的执行路径
- 主线程也是main(),为系统入口,用于执行整个程序
- 后台也有线程,如gc
- 线程的运行由调度器安排,与操作系统相关,先后顺序不能人为干预
- 对同一份资源操作的时候,存在资源抢夺问题,加入并发控制
- 线程带来额外开销,如cpu调度时间
- 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
进程和线程的区别
- 进程是程序的一次执行过程,是系统分配资源的单位。
- 一个进程中至少有一个线程,线程是CPU调度和执行的单位。
线程的创建(Thread,Runnable,Callable)
继承Thread类
- 重写run方法
- 调用start方法
public class ThreadDemo01 extends Thread{
@Override
public void run() {
for (int i = 0; i < 2000; i++) {
System.out.println("thread"+i);
}
}
public static void main(String[] args) {
ThreadDemo01 threadDemo01 = new ThreadDemo01();
threadDemo01.start();
for (int i = 0; i < 2000; i++) {
System.out.println("main"+i);
}
}
}
实现Runnable接口
- 实现Runnable接口
- 实现run方法
- 创建线程对象,调用start方法
public class ThreadDemo02 implements Runnable{
public void run() {
for (int i = 0; i < 2000; i++) {
System.out.println("thread"+i);
}
}
public static void main(String[] args) {
ThreadDemo02 threadDemo02 = new ThreadDemo02();
Thread thread = new Thread(threadDemo02);
thread.start();
for (int i = 0; i < 2000; i++) {
System.out.println("main"+i);
}
}
}
两种方法本质上是一样的,这里用到了基于接口的静态代理模式。
- 接口:Runnable
- 真实角色:实现了Runnable的类
- 代理角色:Thread类
- 扩展的功能:run()方法
源码阅读:
//接口Runnable
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
//Thread部分代码
class Thread implements Runnable {
//实现了Runnable接口的实例target
/* What will be run. */
private Runnable target;
//注入target
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
//代理了target的run方法
@Override
public void run() {
if (target != null) {
target.run();
}
}
}