4月14日总结

java学习

一.多线程

简介:多线程是计算机科学中的一个重要概念,它允许程序同时执行多个任务或操作。在单个程序内部,多线程使得代码可以并行执行,从而提高程序的性能和响应速度。

这里先来介绍一下创建多线程的几种方法。

1.扩展java.lang.Thread类

我们可以创建一个类,继承Thread,并且重写里面的run方法,将这个线程要去做的事写在run方法里面,在主程序实例化一个对象,在通过start启动它,这样就会创建另外一个子线程去执行run方法里面的功能。

 public static void main(String[] args) {Thread t1=new Thread1("A");Thread t2=new Thread1("B");Thread t3=new Thread1("C");t1.start();t2.start();t3.start();}
public class Thread1 extends Thread{private String name;public Thread1(String name){this.name=name;}@Overridepublic void run() {for(int i=1;i<=3;i++){System.out.println(name+"线程执行:"+i);}}
}
C线程执行:1
A线程执行:1
B线程执行:1
A线程执行:2
C线程执行:2
A线程执行:3
B线程执行:2
C线程执行:3
B线程执行:3

可以看到,我们创建的三个子线程的任务交替进行。

为了看的更清楚,我们可以加点提示。

 public static void main(String[] args) {System.out.println("主线程执行");Thread t1=new Thread1("A");Thread t2=new Thread1("B");Thread t3=new Thread1("C");t1.start();t2.start();t3.start();System.out.println("主线程结束");}
主线程执行
主线程结束
B线程执行:1
A线程执行:1
C线程执行:1
A线程执行:2
B线程执行:2
A线程执行:3
C线程执行:2
B线程执行:3
C线程执行:3

为什么主线程开始和结束都最快呢,因为主线程执行到子线程的创建不会停下,这也是多线程的优势,如果不加多线程,主线程会为了执行某个任务而停下,所以主线程会执行很快,子线程是主线程结束后才来时执行的,我们也可以知道,运行时会将所有线程的任务执行完才会停止。

2.实现java.lang.Runnable接口

相比于上一个方法,当前方式创建子线程更具有优势。

1》继承Thread只能单继承,Runnable可以多实现。

2》可以搭配线程池使用

3》适合多个相同的程序代码的线程去处理同一个资源

4》代码可以被多个线程共享,代码和数据独立

下面我们看看实现方式

public class Thread1 implements Runnable{private String name;public Thread1(String name){this.name=name;}@Overridepublic void run() {for(int i=1;i<=3;i++){System.out.println(name+"线程执行:"+i);}}
}
public static void main(String[] args) {System.out.println("主线程执行");Thread1 t1=new Thread1("A");Thread1 t2=new Thread1("B");Thread1 t3=new Thread1("C");new Thread(t1).start();new Thread(t2).start();new Thread(t3).start();System.out.println("主线程结束");}
主线程执行
主线程结束
A线程执行:1
B线程执行:1
C线程执行:1
B线程执行:2
A线程执行:2
B线程执行:3
C线程执行:2
A线程执行:3
C线程执行:3
3.实现Callable接口

相比于前面两种方法,实现Callable接口可以有返回值,还需要借助FutureTask类,去获取返回结果。

实现方法:

public class Thread1 implements Callable<Integer> {private int n;public Thread1(int n){this.n=n;}@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= n; i++) {sum+=i;}System.out.println(1+"-"+n+"之间的和:"+sum);return sum;}
}
 public static void main(String[] args) throws Exception {System.out.println("主线程执行");Thread1 t1=new Thread1(100);FutureTask<Integer> task=new FutureTask<>(t1);new Thread(task).start();System.out.println("主线程结束");}
主线程执行
主线程结束
1-100之间的和:5050

我们还可以调用FutureTask对象的get()方法,去回去返回值。、

4.线程池

简介:线程池是一种线程管理机制,用于优化多线程的创建、使用和销毁过程。它在程序启动时创建一定数量的线程,并将它们保存在一个线程池中。当需要执行任务时,线程池中的线程会被重复利用,而不是每次都创建新线程,从而降低了线程创建和销毁的开销,提高了程序的性能和响应速度。

这里搭配Runnable使用

public class Thread1 implements Runnable{@Overridepublic void run() {for(int i=1;i<=3;i++){System.out.println(Thread.currentThread()+"线程执行:"+i);}}
}
public static void main(String[] args) throws Exception {System.out.println("主线程执行");ThreadPoolExecutor tpool=new ThreadPoolExecutor(3,5,4,TimeUnit.SECONDS,new LinkedBlockingQueue<>(10) );Thread1 r1=new Thread1();tpool.execute(r1);tpool.execute(r1);tpool.execute(r1);tpool.execute(r1);tpool.shutdown();System.out.println("主线程结束");}
主线程执行
主线程结束
Thread[pool-1-thread-1,5,main]线程执行:1
Thread[pool-1-thread-2,5,main]线程执行:1
Thread[pool-1-thread-3,5,main]线程执行:1
Thread[pool-1-thread-2,5,main]线程执行:2
Thread[pool-1-thread-1,5,main]线程执行:2
Thread[pool-1-thread-2,5,main]线程执行:3
Thread[pool-1-thread-3,5,main]线程执行:2
Thread[pool-1-thread-1,5,main]线程执行:3
Thread[pool-1-thread-2,5,main]线程执行:1
Thread[pool-1-thread-3,5,main]线程执行:3
Thread[pool-1-thread-2,5,main]线程执行:2
Thread[pool-1-thread-2,5,main]线程执行:3

ThreadPoolExecutor里面的参数

依次是开始的线程数,最大的线程数(-开始的线程数为预备线程数),线程存活时间(空闲多久后销毁),时间格式,工作队列。

5.总结

多线程的特点和优势:

  1. 并发执行:多线程允许程序的多部分(线程)在同一时间片段内并行执行,从而实现并发。

  2. 资源共享:多个线程可以共享相同的内存地址空间,这使得数据共享和通信更加容易和高效。

  3. 更高的性能:在多核或多处理器系统中,多线程可以充分利用硬件资源,提高程序的执行效率。

  4. 提高响应性:通过将阻塞或耗时的任务放在单独的线程中执行,可以确保用户界面的响应性。

多线程的挑战:

  1. 同步问题:多个线程访问和修改共享数据可能导致数据不一致或冲突,需要使用同步机制如互斥锁、信号量等来解决。

  2. 死锁和竞态条件:不恰当地使用同步机制可能导致死锁或竞态条件,这是多线程编程中常见的问题。

  3. 调试和测试:多线程程序的调试和测试通常比单线程程序更加困难,因为需要考虑到各种可能的执行路径和并发条件。

多线程的应用场景:

  1. 图形用户界面(GUI)应用程序:如浏览器、文本编辑器等,通过多线程确保用户界面的流畅和响应。

  2. 服务器和网络编程:如Web服务器、数据库服务器等,通过多线程处理并发请求。

  3. 并行计算和数据处理:如科学计算、图像处理、机器学习等,通过多线程提高计算效率。

总的来说,多线程是一种强大的编程模型,它可以提高程序的性能和响应速度,但同时也带来了一些复杂性和挑战,需要开发者有一定的经验和技巧来有效地应用。

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

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

相关文章

玩鸿蒙项目来了,请尝鲜

文章目录 前言玩鸿蒙项目的介绍效果截图总结 一、前言 记得拉倒底看效果图。 鸿蒙开发热潮已经来了&#xff0c;大家学习热情还是很大的&#xff0c;还有就是华为生态学堂线下的举办&#xff0c;很多都入局了。 鸿蒙要想快速上手&#xff0c;那么就要自己开始去写页面&…

day10 | 栈与队列 part-2 (Go) | 20 有效的括号、1047 删除字符串中的所有相邻重复项、150 逆波兰表达式求值

今日任务 20 有效的括号 (题目: . - 力扣&#xff08;LeetCode&#xff09;)1047 删除字符串中的所有相邻重复项 (题目: . - 力扣&#xff08;LeetCode&#xff09;)150 逆波兰表达式求值 (题目: . - 力扣&#xff08;LeetCode&#xff09;) 20 有效的括号 题目: . - 力扣&…

自动化收集Unity版本更新日志

自动化收集Unity版本更新日志 &#x1f365;功能介绍&#x1f96a;食用手册填写配置开始搜集 &#x1f368;数据展示 &#x1f365;功能介绍 &#x1f4a1;获取指定年份中所有的Unity版本更新日志。 &#x1f4a1;根据指定字符串过滤。 &#x1f4a1;.收集后自动保存成markdow…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

IntelliJ IDEA 2022.3.2 解决decompiled.class file bytecode version:52.0(java 8)

1 背景 使用idea 打开一个Kotlin语言编写的demo项目&#xff0c;该项目使用gradle构建。其gradle文件如下&#xff1a; plugins {id javaid org.jetbrains.kotlin.jvm version 1.8.20 } group me.administrator version 1.0-SNAPSHOTrepositories {mavenCentral()jcenter()…

【数据分析】AHP层次分析法

博主总结&#xff1a;根据每个方案x各准则因素权重累加结果 对比来选择目标。数据主观性强 简介 AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析结合起来&#xff0c;用决策者的经验判断各衡量目标之间能…

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课&#xff0c;我们学了线性表 单向存储结构&#xff08;也就是单链表&#xff09;&#xff0c;这个是企业常用的技术&#xff0c;且是后面各种的基本&#xff0c;一定要牢牢掌握&#xff0c;如果没有掌握&#xff0c;下面的课程会云里雾里。 一 &#xff0c;循环链表 1…

cdn加速与ssl加速

cdn CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输的更快、更稳定。 简单的来说&#xff0c;就是把原服务器上数据复制到其他服务器上&#xff0c;用户访…

.net框架和c#程序设计第三次测试

目录 一、测试要求 二、实现效果 三、实现代码 一、测试要求 二、实现效果 数据库中的内容&#xff1a; 使用数据库中的账号登录&#xff1a; 若不是数据库中的内容&#xff1a; 三、实现代码 login.aspx文件&#xff1a; <% Page Language"C#" AutoEventW…

事务隔离级别的无锁实现方式 -- MVCC

MVCC的全称是Multiversion Concurrency Control(多版本并发控制器)&#xff0c;是一种事务隔离级别的无锁的实现方式&#xff0c;用于提高事务的并发性能&#xff0c;即事务隔离级别的一种底层实现方式。 在了解MVCC之前&#xff0c;我们先来回顾一些简单的知识点&#xff1a;…

python botos s3 aws

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html AWS是亚马逊的云服务&#xff0c;其提供了非常丰富的套件&#xff0c;以及支持多种语言的SDK/API。本文针对其S3云储存服务的Python SDK&#xff08;boto3&#xff09;的使用进行介绍。 …

使用阿里云试用Elasticsearch学习:Search Labs Tutorials 搭建一个flask搜索应用

文档&#xff1a;https://www.elastic.co/search-labs/tutorials/search-tutorial https://github.com/elastic/elasticsearch-labs/tree/main/example-apps/search-tutorial Full-Text Search