java多线程-创建

简介

  • 定义:多条执行流程并行的技术
  • 优点:异步执行,避免同步等待

创建-继承Thread

代码实现

  1. 继承Thread类
  2. 重写run方法
  3. 新建自建线程的实例
  4. 调用start方法
  1. 继承Thread类
  2. 重写run方法
/*** 1. 继承Thread类* 2. 重写run方法*/
public class MyThread extends Thread{private String name;public MyThread(String name) {this.name = name;}@Overridepublic void run() {try {sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(this.name + " is running.");}
}
  1. 新建自建线程的实例
  2. 调用start方法
MyThread myThread = new MyThread("Thread1");
myThread.start();
System.out.println("不影响主线程的执行");

优缺点

  • 优点:最简单的实现方式
  • 缺点:已经继承了Thread类,无法继承其他类,不利于扩展

创建-实现Runnable接口

  1. 新建一个任务类,实现runnable接口
  2. 重写run方法
  3. 创建runnable实例对象
  4. 把runnable实例对象传递给Thread对象
  5. 调用thread的start方法
  1. 实现runnable接口
  2. 重写run方法
public class MyRunnable implements Runnable {@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("MyRunnable is running.");}
}
  1. 创建runnable实例对象
  2. 把runnable实例对象传递给Thread对象
  3. 调用thread的start方法
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
System.out.println("不影响主线程的执行");

创建-匿名内部类

如果是只使用一次的任务调度,可以使用匿名内部类

  1. 使用匿名内部类代替定义一个实现类
  2. 匿名内部类重写run方法
  3. 将runnable任务类实例交给线程类实例
  4. 调用线程类实例的start方法
// 匿名内部类// 如果只使用一次,可以使用匿名内部类Runnable myRunnable = new Runnable() {@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("MyRunnable is running.");}};// 后续操作是一样的Thread thread = new Thread(myRunnable);thread.start();System.out.println("不影响主线程的执行");

方法体足够简单,是可以使用lambda表达式来实现的

创建-Callable接口

callable接口的出现是为了解决问题的

在这里插入图片描述

实现方式

在这里插入图片描述

  1. 定义一个Callable接口的实现类
  2. 实现类使用泛型,声明返回的结果类型
// 泛型定义的是返回值的类型
public class MyCallable implements Callable<CalResult> {@Overridepublic CalResult call() throws Exception {CalResult calResult = new CalResult(0);for (int i = 0; i < 100; i++) {calResult = new CalResult(calResult.getResult() + i);}return calResult;}
}

定义一个类,来接受子线程的运行结果

public class CalResult {private int result;public CalResult(int result) {this.result = result;}public int getResult() {return result;}
}

1.创建一个Callable对象
2.使用FutureTask来包装Callable对象
3.创建一个线程对象 将FutureTask对象作为参数传递给Thread对象
4.启动线程
5.获取线程执行结果

// 1.创建一个Callable对象
MyCallable myCallable = new MyCallable();
// 2.使用FutureTask来包装Callable对象
// FutureTask是Future的实现类,FutureTask实现了Runnable接口
// FutureTask的泛型参数是Callable对象的返回值类型
FutureTask<CalResult> futureTask = new FutureTask<>(myCallable);
// 3.创建一个线程对象 将FutureTask对象作为参数传递给Thread对象
Thread thread = new Thread(futureTask);
// 4.启动线程
thread.start();
try {// 5.获取线程执行结果// get()方法会阻塞当前线程,直到子线程执行完毕,然后获取子线程的执行结果CalResult calResult = futureTask.get();System.out.println("result: " + calResult.getResult());
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}

优缺点

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

1049.最后一块石头的重量II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 有…

rCore-Turorial-Book第三课(计算机启动流程和程序内存布局与编译流程探索)

本节任务&#xff1a;梳理程序在操作系统中被编译运行的全流程&#xff0c;大体了解我们在没有操作系统的情况下&#xff0c;我们会面对那些困难 重点 1. 计算机组成基础 面对的困难&#xff1a;没有操作系统&#xff0c;我们必须直面硬件资源&#xff0c;管理起他们并为应用程…

PLSQL数据库

目录 什么是PLSQL数据库 PL数据库的实现方法 PL数据库的基本语法 1.作用 2.语法 3.赋值输出 4.引用 5.异常处理 6.if 判断 7.loop循环 8.while循环 9.for循环 10.游标 11.参数游标 12.索引 13.分区表 什么是PLSQL数据库 PL/SQL&#xff08;Procedure Language/…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数&#xff08;COUNT&#xff09; 2. 求和&#xff08;SUM&#xff09; 3. 平均值&#xff08;AVG&#xff09; 4. 最大值&…

全新商业模式!链动3+1模式 无限链动收益!

链动31模式解析 的链动31模式&#xff0c;是一种精心设计的运营模式&#xff0c;它针对运营中的脱发问题提供了有效的解决方案。然而&#xff0c;这一模式并非完美无缺&#xff0c;它也有其固有的劣势。接下来&#xff0c;我们将通过详细的示例&#xff0c;对这一模式进行深入…

CVE-2024-3159:Out of bounds memory access in V8

前言 这个洞在今年的 Pwn2Own 上被利用&#xff0c;目前还没有公开报告。该漏洞可以说是 CVE-2023-4427 漏洞未正确修复&#xff0c;其原理和利用跟 CVE-2023-4427 没有本质区别&#xff0c;CVE-2023-4427 之前分析过&#xff0c;所以这里不作过多说明&#xff0c;仅仅做记录 …

SpringAOP从入门到源码分析大全(四)SpringAOP的源码分析

文章目录 系列文档索引六、EnableAspectJAutoProxy源码分析1、AnnotationAwareAspectJAutoProxyCreator源码&#xff08;1&#xff09;wrapIfNecessary方法&#xff08;2&#xff09;createProxy 2、getAdvicesAndAdvisorsForBean查找所有Advisor&#xff08;1&#xff09;find…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求&#xff0c;感觉挺有意思就写了这篇文章&#xff0c;感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道&#xff0c;这个页面本身没有新闻信息&#xff0c;是…

芒果超媒的“乘风破浪”,差了一点市场海浪的反馈

4月21日晚间&#xff0c;芒果超媒发布了2023年度&2024一季度报告。 芒果超媒2023年实现营业收入146.28亿元&#xff0c;同比增长4.66%&#xff1b;净利润35.56亿元&#xff0c;同比增长90.73%&#xff1b;基本每股收益1.90元。公司拟每10股派发现金红利1.8元。2024年第一季…

路由过滤,策略实验

1配置ip [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [r1-GigabitEthernet0/0/0]int l0 [r1-LoopBack0]ip add 192.168.0.1 32 [r1-LoopBack0]int l1 [r1-LoopBack1]ip add 192.168.1.1 32 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 100.1.1.2 24 [r…

【python】直接在python3下安装 jupyter notebook,以及处理安装报错,启动不了问题

目录 问题&#xff1a; 1 先做准备&#xff0c;查看环境 1.1 先看python3 和pip &#xff0c;以及查看是否有 juypter 1.2 开始安装 1.3 安装完成后得到警告和报错 2 处理安装的报错问题 2.1 网上有说是因为 pip 自身需要更新&#xff0c;更新之 2.1.1 更新pip 2.1.…

牛客NC238 加起来和为目标值的组合【中等 DFS C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/172e6420abf84c11840ed6b36a48f8cd 思路 本题是组合问题&#xff0c;相同元素不同排列仍然看作一个结果。 穷经所有的可能子集&#xff0c;若和等于target&#xff0c;加入最终结果集合。 给nums排序是为了方便…