注意:程序会因为引入多线程而变的复杂,多线程同时会带来一些问题,需要我们解决
多线程应用场景
- 程序需要同时执行两个或多个任务 。
- 程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等 。
- 需要一些后台运行的程序时 。
在使用Java编写后台服务时,如果遇到并发较高、需要后台任务、需要长时间处理大数据等情况都可以创建线程单独的线程处理这些事项,多线程的目的就在于提高处理速度,减少用户等待时间
- 后台记录日志,创建额外线程来记录日志
- 大量用户请求,创建多个线程共同处理请求
- 下载大文件,可以创建单独的线程,不影响正常的业务流畅度
- ......
方式1:继承Thread类
方式2:实现Runnable接口
方式3:实现Callable接口
方式4:使用线程池【这块后边单独说,它更像是管理线程的手段】
继承Thread步骤:
- 自定义类继承Thread类
- 重写run方法,run方法就是线程的功能执行体
- 创建线程对象,调用start方法启动线程
- 启动线程之后,线程不一定会立即执行,需要得到CPU分配的时间片,也就是拿到CPU执行权限才会执行
文章插图
所以知道重写的run方法从哪来的了吧!就是从Runnable接口中来的
需求:创建线程计算10以内的偶数
线程类:
public class ThreadTest extends Thread{// run方法是 线程体,启动线程时会运行run()方法中的代码@Overridepublic void run() {// 输出10以内偶数for (int i = 0; i < 10; i++) {if (i % 2 == 0){System.out.println(i);}}}}
测试类:测试类中输出了一句话:主线程
public class ThreadMain {public static void main(String[] args) {// 1、创建线程对象ThreadTest t1 = new ThreadTest();// 2、调用start方法启动线程t1.start();System.out.println("主线程");}}
打印结果:文章插图
实现Runnable接口步骤:
- 自定义类实现Runnable接口
- 实现run方法
- 创建实现类对象
- 创建Thread对象,在构造方法中传入实现类对象作为参数
- 调用Thread对象的start方法启动线程
实现类:
public class RunnableImpl implements Runnable{@Overridepublic void run() {// 输出10以内偶数for (int i = 0; i < 10; i++) {if (i % 2 == 0){System.out.println(i);}}}}
【结合多本著作和个人开发经验,整理Java多线程入门手册】测试类:public class RunnableMain {public static void main(String[] args) {// 1、创建实现类对象RunnableImpl runnable = new RunnableImpl();// 2、创建线程对象,接收实现类,因为实现类中的run方法承载了线程的功能Thread t1 = new Thread(runnable);// 3、启动线程t1.start();// 主线程System.out.println("主线程");}}
Callable接口FutureTask类:文章插图
RunnableFuture接口:
文章插图
步骤:
- 新建类实现Callable接口,并指定泛型类型,类型就是线程计算之后的结果的类型
- 实现call方法,call方法跟run方法类似,不过该方法有返回值和异常抛出,都是来封装线程功能体的
- 在测试类中创建实现类对象,并且创建 FutureTask 对象将实现类对象当做构造方法参数传入
- 创建Thread线程对象,将 FutureTask 对象当做构造方法参数传入,并调用start方法启动线程
推荐阅读
- 广州医养结合的养老院 老年公寓和养老院设计
- 叔本华生平和著作 叔本华的书
- 做好传帮带工作 以身作则团结合作传帮带是什么意思
- 论语是一部什么体的著作 论语是一部什么体散文
- 岳云鹏|岳云鹏相声太无聊?若结合背后安排的用意,就会佩服他的能力
- 长短句的表达效果 长短句结合的作用阅读理解
- 吴承恩人物解析及著作 吴承恩是哪个朝代的小说家
- 王一博|王一博分饰两角舞动双生,国风与街舞的结合,别有一番风味
- 面是什么意思(点面结合的面是什么意思)
- 鹤唳华亭|《鹤唳华亭》,完成率很高,将风格与文学结合在一起