相关概念
-
进程:启动一个应用程序,就会开启一个进程(微信,QQ,浏览器等等)
-
线程:程序的执行路径
-
进程和线程的区别:进程是在操作系统下的并发,线程是在应用程序下的并发
-
多线程:在同一进程中开启了多个不同的执行路径,多个路径同时执行
-
多线程好处:提高程序整体运行速度,快速响应
-
多线程的应用场景:
- 异步发送短信
- 异步记录日志
- 对耗时代码采用异步处理
-
CPU切换:
单核CPU:同一时刻只有一个线程可以工作,线程上下文切换耗费资源
多核CPU:同一时刻多个线程同时工作,上下文切换较少
-
多线程越多越好?
小型项目:使用多线程异步
大型项目:使用MQ代替多线程
-
用户线程和守护线程的区别:
-
用户线程当主线程停止后,用户线程也会一直运行。thread.setDaemon(false);
-
而守护线程当我们主线程停止后,守护线程也会停止。thread.setDaemon(true);
-
停止线程的方式
建议采用变量的方式停止线程
public class Thread005 extends Thread {
private volatile boolean flag = true;
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
while (flag) {
}
}
public void stopThread() {
this.flag = false;
}
public static void main(String[] args) {
Thread005 thread005 = new Thread005();
thread005.start();
try {
Thread.sleep(3000);
thread005.stopThread();
} catch (Exception e) {
}
}
}
多线程的5种状态
- 新建一个线程,new Thread的时候为新建的状态
- 调用到start方法的时候,当前线程状态为就绪状态,需要等待cpu的切换。
- 当cpu切换能够调用到该线程的时候,当前线程的状态为运行状态。
- 在线程调用sleep方法的时候,当前线程线程的状态为阻塞状态,当休眠的时候过了的时候有需要从新等待cpu调度,从就绪状态到运行。
- 当线程调用stop方法或者run方法代码执行结束的时候当前线程的状态为死亡状态。
join方法
当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
class Main
{
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i <10 ; i++) {
System.out.println("子线程...");
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i <10 ; i++) {
System.out.println("main线程.....");
}
System.out.println("主线程销毁....");
}
}