1.2.启动线程的五类种方法

一.new MyThread().start()

继承Thread类创建线程类

  1. 定义一个继承Thread类的子类,并重写该类的run()方法

  2. 创建Thread子类的实例,即创建了线程对象

  3. 调用该线程对象的start()方法启动线程

二.new Thread(r).start()

实现Runnable接口创建线程类

  1. 定义Runnable接口的实现类,并重写该接口的run()方法

  2. 创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象

注意

在java的体系中,方法一较方法二来说是更好的。因为一个子类只能继承一个父类,但是却可以实现多个接口。

三.直观变形

  • 匿名内部类创建 Thread 子类对象。

Thread thread1 = new Thread(){@Overridepublic void run() {System.out.println("使用匿名类创建 Thread 子类对象");}
};
  • 匿名内部类创 Runnable 子类对象。

Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("使用匿名类创建 Runnable 子类对象");}
});
  • lambda 表达式创建 Runnable 子类对象。

Thread thread3 = new Thread(()-> {System.out.println("使用匿名类创建 Thread 子类对象");
});

四.线程池

参见:

java线程池和多线程的使用详解_java使用线程池启动多线程-CSDN博客

可以重点关注其中的“Java线程池的使用”、“线程和线程池的使用规范”以及对应的策略

五.Future Callable and FutureTask

1.Callable + FutureTask

Callable和Runnable的格式是类似的。

实现Callable的call 方法;

创建一个FutureTask ,用来接收callable的返回;

在主线程中调用 futureTask.get() ,能够阻塞等待(因为自带t.join)新线程计算完毕. 并获取到 FutureTask中的结果

package com.pavin.thread;
​
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
​
public class CallableTest {
​public static class MyCallable implements Callable<Integer> {
​@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 0; i < 100; i++) {sum += i;}return sum;}}
​
​public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable callable = new MyCallable();
​FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t = new Thread(futureTask);t.start();
​Integer result = futureTask.get();System.out.println(result);}
}

输出结果:4950

2.Callable + Future

package com.pavin.thread;
​
import java.util.concurrent.*;
​
public class CallableThreadTest {
​public static class MyCallable implements Callable<Integer> {
​@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 0; i < 100; i++) {sum += i;}return sum;}}
​
​public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService service = Executors.newCachedThreadPool();Future<Integer> future = service.submit(new MyCallable());
​Integer result = future.get();System.out.println(result);service.shutdown();}
}

输出结果:4950

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

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

相关文章

Qt槽函数不响应不执行的一种原因:ui提升导致重名

背景&#xff1a; 一个包含了组件提升的ui&#xff0c;有个按钮的槽函数就是不响应&#xff0c;于是找原因。 分析&#xff1a; 槽函数的对应一是通过connect函数绑定信号&#xff0c;二是on_XXX_signal的命名方式。界面上部件的槽函数通常是第二种。 我反复确认细节&#…

写一个程序拷贝文件

使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读取数据打开文件data_copy.txt&#xff0c;写数据从data.t…

如何使用拼多多根据ID取商品详情 API 获取热销商品信息?

使用拼多多根据ID取商品详情 API 获取热销商品信息是一种高效且便捷的方式&#xff0c;可以快速获取到拼多多平台上热销商品的信息。以下是获取热销商品信息的步骤和示例代码&#xff1a; 一、步骤 注册成为拼多多开发者&#xff0c;并获取API密钥。确定要获取热销商品信息的…

张正友相机标定法原理与实现

张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法。传统标定法的标定板是需要三维的,需要非常精确,这很难制作,而张正友教授提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可…

.Faust勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

引言&#xff1a; 数字时代的黑暗势力中&#xff0c;faust勒索病毒如幽灵般潜伏&#xff0c;将用户的数字珍宝变为数字枷锁。本文将深入介绍.faust勒索病毒的威胁特征&#xff0c;提供有效的数据恢复方法&#xff0c;并分享一系列预防措施&#xff0c;以协助您在数字战场上筑起…

kafka学习笔记--如何保证生产者数据可靠、不重复、有序

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

名字的漂亮度

给出一个字符串&#xff0c;该字符串仅由小写字母组成&#xff0c;定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。 每个字母都有一个“漂亮度”&#xff0c;范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。给出多个字符串&#xff0…

从零开发短视频电商 Low Level Client(推荐)连接OpenSearch进行CRUD

文章目录 依赖初始化客户端发起请求请求参数请求头设置超时时间设置线程数设置用户名密码结果解析节点选择器配置嗅探器整体示例问题参考 OpenSearch开发环境安装Docker和Docker-Compose两种方式 依赖 <dependency><groupId>org.elasticsearch.client</groupId…

【脚本】图片-音视频-压缩文件处理

音视频处理 一&#xff0c;图片操作1&#xff0c;转换图片格式2&#xff0c;多张图片合成视频 二&#xff0c;音频操作1&#xff0c;转换音频格式2&#xff0c;分割音频为多段3&#xff0c;合成多段音频 三&#xff0c;视频操作1&#xff0c;转换视频格式2&#xff0c;提取视频…

【Go自学版】01-基础

// 变量 var a, b, c 8, 2.3, "hello" var d float64; e : 6var A []int; var B [10]int; C : [10]int{1, 2, 3, 4} for i : 0; i < len(B); i {} for _, value : range C {} D make([]int, 3) // len 4, cap 10, 扩容方式 cap*2 E : make([]int, 4, 10) E …

掌握PyTorch数据预处理(一):让模型表现更上一层楼!!!

引言 在PyTorch中&#xff0c;数据预处理是模型训练过程中不可或缺的一环。通过精心优化数据&#xff0c;我们能够确保模型在训练时能够更高效地学习&#xff0c;从而在实际应用中达到更好的性能。今天&#xff0c;我们将深入探讨一些常用的PyTorch数据预处理技巧&#xff0c;…

C++如何通过调用ffmpeg接口对H264文件进行编码和解码

C可以通过调用FFmpeg的API来对H264文件进行编码和解码。下面是一个简单的例子。 首先需要在代码中包含FFmpeg的头文件&#xff1a; extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale…

Linux系统编程:进程间通信总结

管道 在Linux中&#xff0c;管道是一种进程间通信方式&#xff0c;它允许一个进程&#xff08;写入端&#xff09;将其输出直接连接到另一个进程&#xff08;读取端&#xff09;的输入。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同。 具体…

Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

前端知识笔记(二十七)———CSS核心功能手册:从熟悉到精通

参考HTML代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

12.9_黑马数据结构与算法笔记Java

目录 057 多路递归 e03 杨辉三角2 thinking&#xff1a;二维数组的动态初始化&#xff1f; 057 多路递归 e03 杨辉三角3 058 链表 e01 反转单向链表1 058 链表 e01 反转单向链表2 058 链表 e01 反转单向链表3 递归 058 链表 e01 反转单向链表4 为什么是returnn1呢&…

【Cisco Packet Tracer】路由器 NAT实验

NAT的实现方式有三种&#xff0c;即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。 静态转换是指内部本地地址一对一转换成内部全局地址&#xff0c;相当内部本地的每一台PC都绑定了一个全局地址。一般用于在内网中对外提供服务的服务器。 [3] 动态转换是指…

C++ 迭代器

迭代器 迭代器类似于指针类型&#xff0c;也提供了对对象的间接访问。 就迭代器而言&#xff0c;其对象是容器中的元素或 string 对象中的字符。 获取迭代器 容器的迭代器类型 使用作用域运算符来说明我们希望使用的类型成员&#xff1b;例&#xff1a;string::iterator it…

探秘MSSQL存储过程:功能、用法及实战案例

在现代软件开发中&#xff0c;高效地操作数据库是至关重要的。而MSSQL&#xff08;Microsoft SQL Server&#xff09;作为一款强大的关系型数据库管理系统&#xff0c;为我们提供了丰富的功能和工具来处理数据。其中&#xff0c;MSSQL存储过程是一项强大而又常用的功能&#xf…

改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 代码ACmixBiFormerBAMBlock加入方法各种yaml加入结构本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获…