实现多线程的4种方式

实现多线程的4种方式

使用实现多线程有四种方式:

  • 继承 Thread 类;

  • 实现 Runnable 接口;

  • 使用 Callable 和 FutureTask 实现有返回值的多线程;

  • 使用 ExecutorService 和 Executors 工具类实现线程池(如果需要线程的返回值,需要在线程中实现 Callable

    和 Future 接口)

1.1 继承 Thread 类

Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过

Thread 类的 start() 实例方法,start() 方法是一个 native 方法,它将启动一个新线程,并执行 run() 方法。

继承 Thread 类的优点:简单,且只需要实现父类的 run 方法即可( start 方法中含有 run 方法,会创建一个新的

线程,而 run 是执行当前线程)。

继承 Thread 类的缺点:Java 的单继承,如果对象已经继承了其他的类则不能使用该方法,且不能获取线程的返回

值。

package com.multithreading;public class ThreadDemo {public static void main(String[] args) {MyThread1 myThread1 = new MyThread1();MyThread1 myThread2 = new MyThread1();myThread1.start();myThread2.start();}}class MyThread1 extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}
}
# 程序输出
Thread-1
Thread-0

1.2 实现 Runnable 接口

实现 Runnable 接口优点:简单,实现 Runnable 接口必须实现 run 方法。

实现 Runnable 接口缺点:创建一个线程就必须创建一个 Runnable 的实现类,且不能获取线程的返回值。

package com.multithreading;public class RunnableDemo {public static void main(String[] args) {System.out.println(Thread.currentThread().getName());Thread t1 = new Thread(new MyThread2());t1.start();}
}class MyThread2 implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}
}
# 程序输出
main
Thread-0

1.3 使用 Callable 和 FutureTask

CallabTask 优点:可以获取多线程的返回值。

CallabTask 缺点:每个多线程都需要创建一个 Callable 的实现类。

package com.multithreading;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class CallableDemo {public static void main(String[] args) {FutureTask<String> futureTask = new FutureTask<>(new CallerTask());new Thread(futureTask).start();try {String result = futureTask.get();System.out.println(result);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}class CallerTask implements Callable<String> {@Overridepublic String call() {return Thread.currentThread().getName();}
}
# 程序输出
Thread-0

1.4 使用 ExecutorService 和 Executors

线程池 ExecutorService 和工具类 Executors 优点:可以根据实际情况创建线程数量,且只需要创建一个线程池即

可,也能够通过 Callable 和 Future 接口得到线程的返回值,程序的执行时间与线程的数量紧密相关。

线程池 ExecutorService 和工具类 Executors 缺点:需要手动销毁该线程池(调用shutdown方法)。

package com.multithreading;import java.util.concurrent.Callable;public class MyTask implements Callable<String> {private final int id;public MyTask(int id) {this.id = id;}@Overridepublic String call() {return "result of TaskWithResult: " + id;}
}
package com.multithreading;import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class ExecutorServiceDemo {static final int NUMBER = 10;public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool();ArrayList<Future<String>> results = new ArrayList<>();for (int i = 0; i < NUMBER; i++) {results.add(exec.submit(new MyTask(i)));}exec.shutdown();for (Future<String> future : results) {try {System.out.println(future.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}}
}
# 程序输出
result of TaskWithResult: 0
result of TaskWithResult: 1
result of TaskWithResult: 2
result of TaskWithResult: 3
result of TaskWithResult: 4
result of TaskWithResult: 5
result of TaskWithResult: 6
result of TaskWithResult: 7
result of TaskWithResult: 8
result of TaskWithResult: 9

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

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

相关文章

JS获取经纬度, 并根据经纬度得到城市信息

在JavaScript中&#xff0c;获取经纬度通常需要使用定位服务&#xff0c;比如HTML5的Geolocation API。然而拿到坐标后&#xff0c;将经纬度转换为城市信息&#xff0c;则需要使用逆地理编码服务接口&#xff0c;比如百度或者高德的 API, 但是他们收费都很高, 我们可以使用一些…

【matlab程序】海图单位的度分格式

【matlab程序】海图单位的度分格式 海洋与大气科学 点击蓝字 关注我们 思路来源 阅读文献&#xff1a; 文献中图片的横纵坐标出现半分画法&#xff1a; 半分画法&#xff0c;甚至更为精细的坐标轴在小区域研究中更为重要。 图片 图片 01 一度间隔 图片 代码 % 01 运…

2023 第十二届中国智能产业高峰论坛 - 文档大模型的未来展望

目录 前言文档图像分析识别与理解中的技术挑战 文档图像分析识别与理解的研究主题文档图像分析与预处理文档解析与识别版面分析与还原文档信息抽取与理解AI安全知识化&存储检索和管理 多模态大模型在文档图像处理中的应用多模态的GPT-4在文档图像上的表现多模态的Google Ba…

Ubuntu中无法git clone,一直连接不上的解决方法

我的环境 我的电脑是Windows的&#xff0c;CFW也装在Windows中。 解决思路 其实能ping通google就能git clone。 解决步骤 在CFW主页中安装服务模式打开TUN模式重启Ubuntu能ping通了

基因组注释(Annotation)

基因组组装完成后&#xff0c;或者是完成了草图&#xff0c;就不可避免遇到一个问题&#xff0c;需要对基因组序列进行注释。注释之前首先得构建基因模型&#xff0c;有三种策略&#xff1a; 从头注释(de novo prediction)&#xff1a;通过已有的概率模型来预测基因结构&#…

Java实验案例(一)

目录 案例一&#xff1a;买飞机票 案例二&#xff1a;开发验证码 案例三&#xff1a;评委打分 案例四&#xff1a;数字加密 案例五&#xff1a;数组拷贝 案例六&#xff1a;抢红包 案例七&#xff1a;找素数的三种方法 案例八&#xff1a;打印乘法口诀表 案例九&#x…

【360秋招笔试】编程题第二题:修改Web(C++的AC解法)

题目 先看样例&#xff1a; 6 1612*3 7*8*954 11122 4*6222 15712 11115n表示输入n行数据&#xff0c;下面每一行数据表示一个等式。如果能满足 在等式中添加任意一个数字 使得等式两边成立&#xff0c;则输出Yes&#xff0c;否则输出No。如果等式本来就相等&#xff0c;也输…

大厂面试-16道面试题

1 java集合类有哪些&#xff1f; List是有序的Collection&#xff0c;使用此接口能够精确的控制每个元素的插入位置&#xff0c;用户能根据索引访问List中元素。常用的实现List的类有LinkedList&#xff0c;ArrayList&#xff0c;Vector&#xff0c;Stack。 ArrayList是容量…

每日一题 198打家劫舍(动态规划)

题目 198题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

某度sign参数逆向

文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 分析 经过我们几次抓包&#xff0c;测试&#xf…

解决jupyter打开的默认路径问题

已经安装完anaconda&#xff0c;但是jupyter每一次打开的路径都不是自己想要的路径&#xff0c;可以在配置文件中修改jupyter打开的默认路径&#xff0c;具体步骤如下&#xff1a; 首先打开anaconda的命令行 如果有多个环境的&#xff0c;需要输入conda activate 环境名称以下命…

list容器排序案例

案例描述:将Perspn自定义数据类型进行排序&#xff0c;Person中属性有姓名、年龄、身高 排序规则:按照年龄进行升序&#xff0c;如果年龄相同按照身高进行降序 代码示例 #include <iostream> #include <string.h> #include <iterator> #include <vector…

资讯| 工信部拟筹建元宇宙标准化工作组;《权游》作者起诉OpenAI

元宇宙赛道 工信部&#xff1a;优先开展“元宇宙 工业制造”等行业应用标准研制 9月18日&#xff0c;工业和信息化部科技司就《工业和信息化部元宇宙标准化工作组筹建方案&#xff08;征求意见稿&#xff09;》&#xff08;以下简称《方案》&#xff09;公开征求意见。 工业…

小程序搜索词优化:小陈运营的秘密武器

大家好&#xff0c;我是小陈&#xff0c;今天要和大家分享一下小程序搜索词优化的经验和技巧。在数字化时代&#xff0c;小程序已经成为许多企业的重要工具&#xff0c;但要让小程序在竞争激烈的市场中脱颖而出&#xff0c;搜索词优化是不可或缺的一环。在本文中&#xff0c;我…

【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】

文章目录 12.虚函数与多态举例&#xff1a;委托 继承【观察者模式】13.委托相关设计Composite 组合模式Prototype 原型模式 12.虚函数与多态 纯虚函数 一定要 子类重新定义的 继承和复合 关系下的构造和析构 举例&#xff1a;委托 继承【观察者模式】 13.委托相关设计 问题…

云原生安全性:保护现代应用免受威胁

文章目录 引言云原生安全性的挑战云原生安全性的关键实践1. 安全的镜像构建2. 网络策略3. 漏洞扫描和漏洞管理4. 认证和授权5. 日志和监控 云原生安全工具结论 &#x1f389;欢迎来到云计算技术应用专栏~云原生安全性&#xff1a;保护现代应用免受威胁 ☆* o(≧▽≦)o *☆嗨~我…

详解Python的__new__()方法

__new__与__init__的区别 new() 方法主要存在于Python2的新式类和Python3中。它是负责创建类实例的静态方法。 当Python实例化一个对象时&#xff0c;首先调用__new__()方法构造一个类的实例&#xff0c;并为其分配对应类型的内存空间&#xff0c;该实例的内存地址就是它的唯一…

科目二倒车入库

调整座位和后视镜 离合踩到底大腿小腿成130-140 上半身90-100 座椅高度能看到前方全部情况 后视镜调节到能看到后门把手&#xff0c;且后门把手刚好在后视镜上方边缘、离车1/3处。 保持直线&#xff1a; 前进&#xff1a; 车仪表盘中央的原点和地面上的黄线擦边&#xff…

Docker CMD指令如何覆写

在Dockerfile里,CMD指令是可以被覆盖的。 在构建镜像时,可以通过docker build命令的–cmd选项覆盖Dockerfile的CMD: 例如: FROM ubuntu CMD ["echo","hello"]构建时覆盖CMD: docker build -t test --cmd "echo world" .在创建容器时,可以通过…

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…