多线程
多条执行路径,主线程和子线程并行交替执行
program:程序
process: 进程
Thread:线程
进程是系统分配资源的最小单位,线程是CPU调度和执行的最小单位
什么是线程
线程是由进程创建的,是进程的一个实体,一个进程可以有多个线程(线程也可以创建一个新的线程)
单线程:同一个时刻只允许执行一个线程
多线程:同一时刻可以执行多个线程
-
并发:同一个时刻,多个任务交替执行,造成一种同时执行的错觉,单核CPU实现的多任务就是并发
-
并行:同一个时刻,多个任务同时执行,多核CPU可以实现并行
进程中所有线程都结束进程才会结束,主线程结束的时候如果还有其他子线程还在运行的话,进程继续运行,直到所有线程全部结束
线程创建
class Student extends Thread{}
Stuedent student = new Student();
student.star();
Class Student implement Runnable(){}
Student student = new Student();
Thread thread = new Thread(student);
thread.star();
线程终止
Class Student implement Runnable(){
private boolean loop = true;
public void setLoop(boolean loop){
this.loop = loop;
}
public void run(){
while(loop){
}
}
}
Class main{
public static void main(String args[]){
Student student = new Student();
Thread thread = new Thread(student);
thread.star();
Thread.sleep(10000); //休眠10秒
student.setLoop(false); 将while循环条件变为false,结束循环
}
}
线程常用方法
方 法 | 说 明 |
---|---|
void setPriority(int newPriority) | 更改线程的优先级 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join() | 当前线程变为执行状态,其他线程需要等当前线程执行完之后才能继续执行 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程(礼让,当前线程变为就绪状态,可能又被分到CPU继续执行) |
void interrupt() | 中断线程(可以提前结束线程的休眠) |
boolean isAlive() | 测试线程是否处于活动状态 |
setDaemon(true) | 将线程设置为守护线程,除他之外的所有线程结束,此线程跟着结束 |
String getState() | 返回当前线程的运行状态 |
Synchronized 关键字
使用synchronized
修饰的方法控制对类成员变量的访问
访问修饰符 synchronized 返回类型 方法名(参数列表){……} //或者 synchronized 访问修饰符 返回类型 方法名(参数列表){……}
-
synchronized
就是为当前的线程声明一把锁
多个并发线程访问同一资源的同步代码块时
-
n同一时刻只能有一个线程进入synchronized(this)同步代码块
-
n当一个线程访问一个synchronized(this)同步代码块时,其他synchronized(this)同步代码块同样被锁定
-
n当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码
线程安全
方法是否同步 | 效率比较 | 适合场景 | |
---|---|---|---|
线程安全 | 是 | 低 | 多线程并发共享资源 |
非线程安全 | 否 | 高 | 单线程 |
StringBuffer:线程安全,速度慢
StringBuilder:非线程安全,速度快