一、线程的基本认识
1.1线程的基本介绍
线程是什么?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。
为什么会有多线程?
①因为其是CPU的最小调度单位,所以在多核CPU中,可以利用多CPU执行多线程可以实现真正意义上的并行执行
②在一个应用程序,会存在多个同时执行的任务,如果一个任务阻塞,那会引起不依赖该任务的任务也被阻塞。通过创建对不同任务不同的线程去处理,可以提高程序处理的实时性
③线程可以认为是轻量级的进程,所以线程的创建、销毁比进程更快
为什么要用多线程?
①异步执行②利用多CPU的资源实现真正意义上的并行执行
1.2多线程的应用场景
①使用多线程实现文件下载
②后台任务:如定时向大量的用户发送邮件
③异步处理:记录日志
④多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割为多个线程完成。
总结
多线程的本质是:合理利用多核心CPU资源来实现线程的并行处理,来实现同一个进程内的多个任务的并行执行,同时基于线程本身异步执行特性,提高任务处理的效率。
1.3如何在java中应用多线程
java中实现多线程的方式
①继承Thread类
public class ThreadDemo extends Thread {
@Override
public void run() {
System.out.println("执行 "+ Thread.currentThread().getName());
}
public static void main(String[] args) {
ThreadDemo thread=new ThreadDemo();
thread.start();
}
}
②实现Runnable接口
public class RunnableDemo implements Runnable{
@Override
public void run() {
System.out.println("执行"+Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread=new Thread(new RunnableDemo());
thread.start();
}
}
③实现Callable接口
public class CallableDemo implements Callable {
@Override
public String call() throws Exception {
return "Hello world ||"+Thread.currentThread().getName();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//线程池的创建
ExecutorService service =Executors.newFixedThreadPool(1);
//创建CallableDemo对象,加入线程池,去获取线程结果
Future<String> future = service.submit(new CallableDemo());
System.out.println(future.get()+"|||"+Thread.currentThread().getName());
}
这三种实现方式的差异
Thread是以继承的方式、而Runnable和Callable是以实现的方式。继承只能继承一个类,不能多继承,而实现可以多个
1.4Java线程的生命周期
Java线程从创建到销毁,一共经历6个状态
NEW:初始状态,线程被构建,但还没有调用start方法
RUNNABLE:运行状态,JAVA线程把操作系统中的就绪状态和运行两种状态统一称为“运行状态”
合并了READY就绪状态和RUNNING运行状态
BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了CPU使用权
当等待进入synchronized方法或代码块时
WAITING:等待状态
Object.wait()、Object.join()、LockSupport.park()
TIIME_WAITING:超时等待状态,超时后自动返回
Thread.sleep(long)、Object.wait(long)、Thread.join(long)
TERMINATED:终止状态,表示当前线程执行完毕
Jps //查看进程ID
Jstack PID //去查看进程日志,可以看到对应线程的状态
来源于:咕泡学院课程的学习总结