结合多本著作和个人开发经验,整理Java多线程入门手册( 二 )


注意:程序会因为引入多线程而变的复杂,多线程同时会带来一些问题,需要我们解决
多线程应用场景

  • 程序需要同时执行两个或多个任务 。
  • 程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等 。
  • 需要一些后台运行的程序时 。
多线程多数在浏览器、Web服务器、数据库、各种专用服务器【如游戏服务器】、分布式计算等场景出现 。
在使用Java编写后台服务时,如果遇到并发较高、需要后台任务、需要长时间处理大数据等情况都可以创建线程单独的线程处理这些事项,多线程的目的就在于提高处理速度,减少用户等待时间
  • 后台记录日志,创建额外线程来记录日志
  • 大量用户请求,创建多个线程共同处理请求
  • 下载大文件,可以创建单独的线程,不影响正常的业务流畅度
  • ......
多线程创建方式线程创建有4种方式:
方式1:继承Thread类
方式2:实现Runnable接口
方式3:实现Callable接口
方式4:使用线程池【这块后边单独说,它更像是管理线程的手段】
继承Thread步骤:
  • 自定义类继承Thread类
  • 重写run方法,run方法就是线程的功能执行体
  • 创建线程对象,调用start方法启动线程
  • 启动线程之后,线程不一定会立即执行,需要得到CPU分配的时间片,也就是拿到CPU执行权限才会执行
JDK源码中,Thread类定义实现了Runnable接口
结合多本著作和个人开发经验,整理Java多线程入门手册

文章插图
所以知道重写的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("主线程");}}打印结果:
结合多本著作和个人开发经验,整理Java多线程入门手册

文章插图
实现Runnable接口步骤:
  • 自定义类实现Runnable接口
  • 实现run方法
  • 创建实现类对象
  • 创建Thread对象,在构造方法中传入实现类对象作为参数
  • 调用Thread对象的start方法启动线程
同样的需求打印10以内的偶数
实现类:
 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类:
结合多本著作和个人开发经验,整理Java多线程入门手册

文章插图
RunnableFuture接口:
结合多本著作和个人开发经验,整理Java多线程入门手册

文章插图
步骤: