java多线程 简简单单的学它

java多线程

什么是线程

通俗的讲,就是一个软件里相互独立,同时运行的功能。比如我们打开B站,看视频时,我们会看到画面,听到声音,闪过的弹幕,这些都可以看作是一个线程。

在理解线程前,先理解两个概念:

并发:同一时刻,有多个指令在单个cpu上交替执行。

并行:同一时刻,有多个指令在多个cpu上同时执行。

所以当cpu资源充足时,可以把多线程的运行看作并行,而当cpu资源不充足时,比如只有一个cpu,有两个线程需要cpu进行计算,那么cpu就会来回在两个线程间服务,这是可以看作并发。

如何创建线程

方式一

继承Thread对象,实现run方法(代码简单,不易扩展)

public class MyThread extends Thread{@Overridepublic void run() {//书写线程执行的代码for (int i = 0; i < 100; i++) {System.out.println(getName() + "helloworld!");}}
}public class ThreadDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {MyThread myThread1 = new MyThread();MyThread myThread2 = new MyThread();myThread1.setName("线程1:");myThread2.setName("线程2:");myThread1.start();myThread2.start();}
}

请问这是我们能看到运行的线程有几个?

答:3个,main主线程、线程1、线程2。这个时候主线程在干自己的事,另外两个线程也同时在干他们自己的事,互相之间没有交际,相互独立。

方式二

实现Runnable接口,重写run方法(扩展性强,相对复杂)

public class MyRun implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + "helloworld");}}
}public class ThreadDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {MyRun myRun1 = new MyRun();MyRun myRun2 = new MyRun();Thread t1 = new Thread(myRun1);Thread t2 = new Thread(myRun2);t1.start();t2.start();}
}

请问这样写为什么说易扩展呢?

我提一点,降低了耦合度,这些Thread对象就是用来开启多线程的,要运行的代码都在实现Runnable的run方法里,将线程要执行的任务和线程的启动分离开来。

方式三

实现Callable接口,重写call方法,创建Future获取多线程运行的结果(前两种不能获取线程的结果,要获取线程执行的结果只能用这种方法)

public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= 100; i++) {sum += i;}return sum;}
}public class ThreadDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable myCallable = new MyCallable();FutureTask<Integer> integerFutureTask = new FutureTask<>(myCallable);//主线程在正常执行,然后分了一个子线程去实现myCallable这个对象任务。Thread thread = new Thread(integerFutureTask);thread.start();Integer integer = integerFutureTask.get();System.out.println(integer);}
}

你能想到那些应用场景吗?

答:大数据,当你要处理成百上千条数据,并且要把处理后的结果收集起来做分析。如果单线程一条一条处理,一条1秒,那么60条就是1分钟,而你开启多线程,创建60个线程,让他们同时处理,理论上处理60条的时间就是1秒,一下提升了60倍。

期待更新…

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

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

相关文章

【Java_JSON】如何从JSON数据中提取value值

如何从JSON数据中提取value值&#xff1f; 首先将JSON数据转成字符串 创建JSONObject 对象 通过kv键值对的特性 使用key值来获取value 值 并输出 结果&#xff1a;

c++中锁定数据出现读写错误的例子

2010-4 程序出现了问题&#xff0c;引出了数据逻辑问题。 下面两个函数GetNextDataIndexW();和SetNextDataIndexW分别锁定&#xff0c; 导致了可能两个线程通过了GetNextDataIndexW();但是在SetNextDataIndexW出现数据写入错误。 这是一个典型的数据同步错误&#xff0c;也是…

mysql 中的一些重要函数

show create table user_profile 查看表结构 1.datediff(end_date,start_date)函数&#xff0c;now(), curdate() curtime() date_add(日期,interval num 时间) date_format(日期,格式) 4.select IFNULL(null,0); oracle 中nvl 函数 5.select IF(2 > 1, 2,0)&#xff…

c++: 缺省参数/默认参数的详解及其应用

c缺省参数/默认参数的详解及其应用 缺省参数是什么 #include<iostream> using namespace std;void func(int a 666) {cout << "a " << a << endl; } int main() {func(); //没有传参func(10); //传参return 0; }缺省参数就是在我们不进…

计算机体系结构:VLIW

原文来自知乎 计算机体系结构&#xff1a;VLIW 本文主要介绍计算机体系结构中的VLIW&#xff0c;以供读者能够理解该技术的定义、原理、应用。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;计算机杂记 &#x1f…

腾讯云服务器99元一年购买入口链接

腾讯云服务器99元一年购买入口链接如下&#xff0c;现在已经降价到61元一年&#xff0c;官方活动链接如下&#xff1a; 腾讯云99元服务器一年购买页面腾讯云活动汇聚了腾讯云最新的促销打折、优惠折扣等信息&#xff0c;你在这里可以找到云服务器、域名、数据库、小程序等等多种…

【uniapp】小程序自定义一个通用的返回按钮组件

左边箭头&#xff0c;右边文字可以自定义&#xff0c;但是不要太长&#xff0c;太长可以自己改 .back的width值&#xff0c;改宽一点。 用这个组件的时候首先要在pages.json里把导航栏变成自定义的&#xff1a; ,{"path" : "pages/test/test","style&…

C#常识篇(三)

内置类型字节大小 以下是 C# 中常见内置数据类型的字节大小&#xff1a; bool&#xff08;布尔&#xff09;类型&#xff1a;通常为 4 或者 8 字节。在不同平台上可能会有所不同。 byte&#xff08;无符号字节&#xff09;类型&#xff1a;始终为 1 字节。 sbyte&#xff08;有…

Goose:Golang中的数据库迁移工具

Goose&#xff1a;Golang中的数据库迁移工具 在Golang开发中&#xff0c;数据库迁移是一个常见的任务&#xff0c;用于管理数据库模式的演化和版本控制。Goose是一个轻量级的、易于使用的数据库迁移工具&#xff0c;专为Golang开发者设计。本文将介绍Goose的基本概念、用法和优…

智能驾驶规划控制理论学习01-自动驾驶系统介绍、规划控制模块介绍

目录 一、自动驾驶系统概述 二、规划控制模块介绍 1、规划控制架构 2、规划控制目标 3、Cartesian和Frenet坐标系 4、Frenet坐标系概览 5、解耦式规划和联合式规划 一、自动驾驶系统概述 目前被国内外广为接受的自动驾驶级别划分标准是 SAE&#xff…

Nano 33 BLE Sense Rev2学习第二节——手机蓝牙接收数据

Nano 33 BLE Sense Rev2需要下载的程序 #include <ArduinoBLE.h> #include "Arduino_BMI270_BMM150.h"float x, y, z; int degreesX 0; int degreesY 0;BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // create service// cre…

2024年两会-区块链方向-新质生产力-先进制造业集群

区块链寒冬还未散去&#xff0c;但区块链引发的信任革命&#xff0c;对生产关系的变革&#xff0c;对数字金融产生的广泛影响&#xff0c;对货币金融体系的完全重构&#xff0c;对数据融合和隐私安全带来的巨大冲击才刚刚开始&#xff0c;没有不好的技术&#xff0c;只有不好的…

XSS漏洞--概念、类型、实战--分析与详解[结合靶场pikachu]

目录 一、XSS概念简述 1、XSS简介&#xff1a; 2、XSS基本原理&#xff1a; 3、XSS攻击流程&#xff1a; 4、XSS漏洞危害&#xff1a; 二、XSS类型&#xff1a; 1、反射型XSS&#xff1a; 2、存储型XSS&#xff1a; 3、DOM型XSS&#xff1a; 三、靶场漏洞复现(pikach…

LVS四层负载均衡集群

简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩博士主导的开源负载均衡项目&#xff0c;目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案&#xff0c;终端互联网用户从外部访…

基于 Guava 的 RateLimiter 实现预热功能

基于 Guava 的 RateLimiter 实现预热功能 Guava 的 RateLimiter 类提供了一种限流的机制&#xff0c;它可以控制在给定的时间间隔内允许的操作速率。虽然 Guava 的 RateLimiter 类本身并没有提供预热模型的功能&#xff0c;但是你可以通过自定义的方式实现一个简单的预热模型。…

html地铁跑酷

下面是一个简单的HTML代码来展示一个地铁跑酷游戏&#xff1a; <!DOCTYPE html> <html> <head><title>地铁跑酷</title><style>#player {position: absolute;top: 0;left: 0;width: 50px;height: 50px;background-color: red;}</style…

C语言 通讯录项目动态版本 容量可增加

项目在clion通过简单测试 代码在三个文件里写成 ①main.c 项目大框架 #include"game.h"//显示菜单 void Menu(){printf("****1.添加用户 2.删除用户****\n");printf("****3.查找用户 4.修改用户****\n");printf("****5.显示用户 6.…

diffusion model (扩散模型)原理

扩散模型分为正向过程和反向过程。 正向过程为一点点在图片上添加噪声的过程&#xff0c;反向过程为去噪声的过程。 图片的生成就是反向过程&#xff0c;给一张高斯噪声图片&#xff0c;逐步去噪生成图片。 扩散模型和VAE的区别&#xff0c; VAE是一步到位的&#xff08;通过…

一个基于差异同步数据库结构的工具 - Skeema

本文是 GO 三方库推荐的第 5 篇&#xff0c;继续介绍数据库 schema 同步工具&#xff0c;我前面已经写了两篇这个主题的文章。系列查看&#xff1a;Golang 三方库。 今天&#xff0c;推荐是的一个基于差异实现数据库 schema 迁移的工具库 - skeema&#xff0c;同样由 Go 实现。…

数字孪生10个技术栈:数据采集的八种方式

大家好&#xff0c;我是贝格前端工场&#xff0c;上期讲了数字孪生10个技术栈&#xff08;总括&#xff09;:概念扫盲和总体介绍&#xff0c;获得了大家的热捧&#xff0c;本期继续分享技术栈&#xff0c;大家如有数字孪生或者数据可视化的需求&#xff0c;可以联络我们。 一、…