进程与线程
进程
介绍
Process
- 一个正在运行程序的实例
- 操作系统进行资源分配和调度的基本单位
特点
- 独立性,每个进程都有独立的内存空间和系统资源
- 并发性,多个进程可以并发执行
- 动态性,进程时程序的一次执行过程
线程
介绍
Thread
java.lang
- 进程中的一个执行单元
特点
- 共享性,同一个进程中多个线程共享同一个内存空间和资源
- 轻量级,线程的开销比进程小
- 并发性,多个线程并发执行
特性
- 原子性,一次执行,要么全部完成,要么全部失败
- 可见性,一个线程修改共享变量,在其他线程是可见的
- 有序性,保证代码的执行顺序,禁止指令重排
volatile
介绍
volatile
关键字,用于修饰变量
- 保证变量的可见性和有序性
线程创建
继承Thread类
使用
- 继承
Thread
类
- 重写
run()
方法
- 实例化子类
示例
public class NewThread extends Thread{
@Override
public void run(){
...
}
}
public class Main{
Thread thread = new NewThread();
thread.start();//启动线程
}
实现Runnable接口
特点
- 一个
Runnable
实例可以共享给多个线程
- 避免了单继承的限制,优于继承
Thread
类创建线程
使用
- 实现
Runnable
接口
- 重写
run()
方法
- 实例化
Thread
类,传参Runnable
实现类
示例
public class NewRunnable implements newThread{
@Override
public void run(){
...
}
}
public class Main{
Thread thread = new Thread(new NewRunnable());
thread.start();
}
生命周期
- 新建(
New
),创建线程对象,尚未启动
- 就绪(
Runnable
),线程已启动,等待Cpu
调度执行
- 运行(
Running
),线程执行run()
方法
- 阻塞(
Blocked
),线程暂停执行
- 终止(
Terminated
),线程执行完毕或强行终止
- 等待(
Waiting
)
- 线程因调用
wait
或join
方法进入等待状态,等待其他线程唤醒,会释放锁
- 限时等待(
Timed Waiting
)
- 线程因调用
sleep()
方法进入限时等待状态,不会释放锁
方法
方法 |
描述 |
void start() |
启动线程 |
void run() |
执行线程主体方法 |
void sleep(long millis) throws InterruptedException |
休眠当前线程,不释放锁,单位: 毫秒 |
void join(long millis) throws InterruptedException |
调用线程进入阻塞状态,直到另一个线程执行完成或超时,可以设置现成的最大等待时间 |
void yield() |
当前线程让出CPU 使用权,让其他同优先级的线程优先执行 |
void setPriority(int priority) |
设置线程优先级,1 – 10 |
void interrupt() throws InterruptedException |
中断线程 |
void isAlive() |
判断线程是否处于活动状态 |
Thread currentThread() |
获取当前线程对象 |
String getName() |
获取当前线程名 |
long getId() |
获取当前线程Id |
线程同步
介绍
同步方法
介绍
- 使用
synchronized
关键字修饰的方法
- 确保了同一时间内只有一个线程可以访问该方法
示例
public synchronized void method(){...}
同步代码块
介绍
- 使用
synchronized
关键字修饰的代码块
- 确保了同一时间内只有一个线程可以访问该代码块
示例
synchronized(Object object){
...
}
线程间通信
介绍
- 两个或多个线程之间传递数据的操作
- 通过
Object
类的方法实现
- 必须在同步方法或同步代码块中运行
方法
方法 |
描述 |
void wait(long timeout) throws InterruptedException |
释放当前线程的锁,进入等待队列,等待唤醒或超时 |
void notify() |
随机唤醒一个等待的线程 |
void notifyAll() |
唤醒所有等待的线程 |
死锁
- 多个线程抢夺资源时进入了相互等待的状态,导致程序无法继续执行
- 避免锁嵌套和设置定时锁可以用来解决死锁问题
守护线程
特点
- 自动终止
- 当所有非守护线程执行完后,无论守护线程是否执行完成,都会自动终止
- 低优先级
- 守护线程通常用于执行一些不重要的任务,比如垃圾回收,监控等
- 不能执行关键人物
- 适用于后台服务(垃圾回收线程,日志记录)和定时任务场景(定时清理缓存,发送心跳包)
方法
方法 |
描述 |
void setDaemon(boolean on) |
设置当前线程为守护线程,必须在start() 之前设置,否则会抛出IllegalThreadStateException 异常 |
示例
Thread thread = new Thread(() -> {
Thread daemonThread = new Thread(() -> {
while(true){
System.out.println("守护线程正在工作.....");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
});
daemonThread.setDaemon(true);//设置为守护线程
daemonThread.start();//启动守护线程
//执行主线程逻辑
System.out.println("主线程运行中....");
});
thread.start();//启动主线程