Java多线程
个人结合所学知识整理,如有错误理解敬请指正,感谢🙏
0.基础知识
程序、进程、线程
- 程序(program)本质上是为了完成某项特定任务而使用某种语言编写的指令集合
- 进程(process)是程序的一次执行过程,当程序开始运行,会被加载到内存中,执行时占用cpu资源,执行完毕释放资源(产生-存在-消亡的过程即线程的生命周期);进程可以理解为cpu的资源分配单位,系统在运行时会给每个进程分配不同的内存区域
- 线程(thread)进程的进一步细化,是程序的执行路径。如果一个进程能够同步执行多个线程,那么这个进程就是支持多线程的;线程可以理解为cpu调度和执行单位,每个线程拥有独立的运行栈和程序计数器,线程切换开销小
并行、并发
- 并行:多个cpu同时执行多个任务,如多个人做不同的事,但实际上此时一个人只能做一件事
- 并发:一个cpu同时做多个任务,如一个人同时做多个任务,但实际上同一时间并不是做个任务同时在做,而是采用时间片的技术,分时执行
多线程的优点
- 提高程序的响应速度,提高用户的使用体验
- 提高cpu利用率,减少资源闲置
- 改善程序结构,将复杂的程序细化为多个线程独立运行,有利于理解和修改
多线程的应用场景
- 程序需要同时执行多个任务
- 避免程序在执行==需要等待的任务(如用户输入、文件读写操作、网络操作、搜索等)==时阻塞其他任务的运行
- 需要一些后台执行的程序是也需要用到多线程
Java线程的分类
- 用户线程:开发者自己编写的线程
- 后台(守护)线程:用来服务用户线程的线程
1.线程的创建
线程的四种创建方式
-
继承Thread类
//1.创建线程类并继承Thread类,重写run方法 public class MyThread extends Thread { @Override public void run() { System.out.println("myThreadRun"); } } //测试 @Test void testCreateThreadByExtends(){ //创建线程实例 MyThread myThread = new MyThread(); //调用start方法运行线程 myThread.start(); } //运行结果:myThreadRun
-
实现Runnable接口(线程无返回值)
//2.实现Runnable接口,重写run方法 public class MyThread implements Runnable { @Override public void run() { System.out.println("myThreadRun"); } } //测试 @Test void testCreateThreadByImplements(){ //创建线程实例 MyThread myThread = new MyThread(); //实例化Thread类,并传入自己的线程类 Thread thread = new Thread(myThread); //调用start方法运行线程 thread.start(); } //运行结果:myThreadRun
-
实现Callable接口(线程有返回值)
//3.实现Callable接口,泛型为返回值类型,重写call方法 public class MyCallableThread implements Callable<Integer> { @Override public Integer call() throws Exception { int sum = 0; for (int i = 1; i < 10; i++) { if(i%2==0){ sum += i; } } return sum; } } //测试 @Test void testCreateCallableThread(){ //创建自定义线程 MyCallableThread callableThread = new MyCallableThread(); //创建FutureTask实例并传入自定义线程 FutureTask<Integer> futureTask = new FutureTask<>(callableThread); //创建线程实例并传入FutureTask实例 Thread thread = new Thread(futureTask); //调用start方法启动线程 thread.start(); //获取线程返回的值 try { Integer sum = futureTask.get(); System.out.println("10以内偶数和为:" + sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } //输出结果:10以内偶数和为:20
-
通过线程池创建
//4.创建自定义线程,通过线程池执行线程 public class MyThread implements Runnable { @Override public void run() { System.out.println("MyThreadRun"); }<