IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 2021-08-29 Java 线程1 创建的3种方法 -> 正文阅读

[Java知识库]2021-08-29 Java 线程1 创建的3种方法


项目开发中,不会使用下面 3 种线程的实现方式,因为上面 3 种线程实现方式无法控制
线程,可能会造成系统资源耗尽,浪费系统资源,造成系统的性能下降。仅做原理理解。

1、继承 Thread 类,实现多线程

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) {
        ThreadA threadA = new ThreadA();
        threadA.run();
    }

    public static class ThreadA extends Thread{
        // run 是线程执行主体;多线程业务在 run 方法中运行
        @Override
        public void run() {
            log.info("继承 Thread 实现方式.......");
            // 业务代码执行
            int i = 100/3;
            log.info("业务代码执行结果:{}, 线程名称:{}, 线程 ID:{}",i,this.getName(),this.getId());
        }
    }
}

2、 实现 Runnable 接口,实现多线程

2.1 普通构建方式

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) {
        // 创建多线程对象
        Thread02 thread02 = new Thread02();
        // 创建多线程对象
        Thread thread = new Thread(thread02);
        // 开启线程
        thread.start();
    }

    public static class Thread02 implements Runnable {
        @Override
        public void run() {
            log.info("继承 Thread 实现方式.......");
            // 业务代码执行
            int i = 100 / 3;
            log.info("业务代码执行结果:{}", i);
        }
    }
}

2.2 匿名内部类的构建方式

匿名内部类使用: 接口名称 对象名=new 接口名称(){//覆盖重写所有的抽象方法};
作用:内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                log.info("继承 Thread 实现方式.......");
                // 业务代码执行
                int i = 100 / 3;
                log.info("业务代码执行结果:{}", i);
            }// 创建线程对象
        };
        Thread thread = new Thread(runnable);
        // 开启线程执行
        thread.start();
    }
}

2.3 lambda 表达式实现

lambda 表达式特点:

  1. @FunctionalInterface: 此直接表示可以使用 lambda 表达式的编程方式,此注解相当于是一个标识
  2. 接口只有一个方法(必须满足)-- 即使没有上面注解,也可以使用lambda表达式;程序员会在后台自动识别
  3. 写作形式: 方法括号(有参写,无参不写)

Runnable 接口只有一个方法,满足条件。

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(()->{
            log.info("继承 Thread 实现方式.......");
            // 业务代码执行
            int i = 100 / 3;
            log.info("业务代码执行结果:{}", i);
        });
        // 开启线程执行
        thread.start();
    }
}

3 Callable + FutureTask 实现多线程

  • jdk1.5 后:添加 callable 接口,实现多线程,相较于 Thread, runnable 接口没有返回值,但是 callable 接口是有返回值。
  • 接口参数 public interface Callable :
  • 接口说明:
    1、具有泛型的接口,只有一个方法 call,call 方法就是多线程执行业务主体;
    2、方法执行完毕后有返回值,返回值类型就是制定的泛型类型

疑问:多线程执行必须和 Thread 有关系,callable 接口和 thread 有什么关系呢??
FutureTask 构造函数 有Callable.
在这里插入图片描述

3.1 普通实现方式

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) {
        Thread03 thread03 = new Thread03();
        // 创建 futureTask 对象,把 thread03 对象传递构造函数中
        FutureTask<Integer> task = new FutureTask<Integer>(thread03);
        // 创建多线程对象
        Thread thread = new Thread(task);
        // 开启线程执行
        thread.start();
        try {
            // 同步阻塞的情况
            Integer integer = task.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    public static class Thread03 implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            log.info("继承 Thread 实现方式.......");
            // 业务代码执行
            int i = 100 / 3;
            log.info("业务代码执行结果:{}", i);
            return i;
        }
    }
}

3.2 匿名内部类

3.3 lambda 表达式

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 11:52:17  更:2021-08-30 11:52:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:23:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码