Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by Executors.defaultThread Factory
Java中的多线程使用教程-CSDN博客
52Hertz910 已于 2025-07-28 22:08:53 修改 阅读量387 收藏 3 点赞数 10 分类专栏: Java学习笔记 文章标签: java 于 2025-07-28 21:41:16 首次发布 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 线程状态变化 T.start() 1.T.sleep结束 2.t2终止 3.等待用户完毕 1.T.sleep() 2.t2.join() 3.等待用户输入 OS选中,此线程获取cpu时间片 时间片用完/T.yield() run(),main()结束 看到对象的synchronized方法 此线程调用o.wait() 其他线程调用o.notify()/o.notifyAll() 拿到对象的锁 初始状态(new) 可运行状态(Runnable) 阻塞状态 运行状态 死亡状态(Dead) 锁池队列 等待队列 线程创建 在Java多线程编程中,有多种方式可以创建和启动线程。下面详细介绍三种主要的线程创建方式及其区别。 1.
简单设计一个JAVA并行处理工具类 - 狂盗一枝梅 - 博客园
在工作中,我们肯定遇到过一个接口要处理N多事项导致接口响应速度很慢的情况,通常我们会综合使用两种方式来提升接口响应速度 优化查询SQL,提升查询效率 开启多线程并发处理业务数据 这里讨论第二种方案:使用多线程并发处理业务数据,最后处理完成以后,拼装起来返回给前端,每个人的实现方案都不一样,我在工作的这几年也经历了几种写法。 一、几种常见的并行处理写法 其代码形式如下 @Test public void test1() { //定义线程池 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardPolicy()); //异步执行 Future<String> getUserName = threadPoolExecutor.submit(() -> { //do...
Java 线程池的奥秘:让你的代码跑得像火箭!
欢迎来到Java线程池的奇幻世界!如果你曾经觉得Java代码跑得像蜗牛,或者你的应用程序偶尔像是喝醉了酒,那你可能需要了解一下Java线程池的秘密武器!今天我们就来深入浅出地揭开线程池的神秘面纱,顺便拯救你的应用程序于水火之中。 什么是线程池? 先来个小故事:假设你是一家包子铺的老板。突然某天来了100个顾客,每个顾客都要现包现蒸的包子。如果你只有一个厨师,那这个厨师会累得吐血,而顾客们也会饿得发慌。聪明的你决定雇佣多个厨师,这样可以同时处理多个订单。但是,雇太多厨师也不划算,他们会在没有订单的时候无所事事,白吃白喝。 线程池就是这样一个聪明的“厨师管理器”。它可以有效地管理多个线程,避免频繁创建和销毁线程带来的开销,同时还可以根据需要动态调整线程数量,让线程的使用更加高效。 线程池的基本原理 Java线程池是通过java.util.concurrent包中的Executor框架实现的。最常用的线程池实现是ThreadPoolExecutor。它的工作原理就像一个高度组织化的包子铺:...
百万数据处理导致服务器瘫痪,更改为多线程处理-CSDN博客
多线程导入百万数据 一、如何开启多线程 1.继承Thread类 public class ThreadTask extends Thread{ @Override public void run() { System.out.println("成功运行"); } } public class ThreadDemo { public static void main(String[] args) { ThreadTask thread = new ThreadTask(); ThreadTask thread2 = new ThreadTask(); thread.start(); thread2.start(); } } 2.实现Runnable接口 public class RunnableTask implements Runnable{ @Override public void run() { System.out.println("线程开启成功"); } } public class RunnableDemo { public static void...
【Mongodb】Mongodb亿级数据性能测试和压测-CSDN博客
一,mongodb数据性能测试 如需转载,请标明出处:https://zhenghuisheng.blog.csdn.net/article/details/139505973 之前公司将用户的游戏数据存储在mysql中,就是直接将json数据存储到mysql数据库里面,几个月不到,数据库里面已经有两亿条数据,而且每行中每个json数据量也比较大,导致占用的磁盘容量也比较大,因此为了解决mysql带来多方面的瓶颈,最终选择使用mongodb来代替mysql。为了测试mongodbdb的性能以及是否满足需求,因此做了以下测试,对mongodb在高流量时验证其增删改查的效率,以及对其进行压测 服务器配置:2核4g轻量级服务器 磁盘容量 70GB 每条数据大概在500个字节,索引有一个id主键索引,还有一个parentId和category的联合唯一索引,这里两个字段能保证唯一性,因此用唯一索引效率更优 1,mongodb数据库创建和索引设置 首先在Java代码中创建一个实体类,用这个类作为json对象插入到文档中即可。 @Data public class Archive {...
线程池核心原理浅析 - fuxing. - 博客园
由于系统资源是有限的,为了降低资源消耗,提高系统的性能和稳定性,引入了线程池对线程进行统一的管理和监控,本文将详细讲解线程池的使用、原理。 池化思想 线程池主要用到了池化思想,池化思想在计算机领域十分常见,主要用于减少资源浪费、提高性能等。 池化思想主要包含以下几个方面: 一些常见的资源池包括线程池、数据库连接池、对象池、缓存池、连接池等。 池化思想可以提高系统的性能,因为它减少了资源的创建和销毁次数,避免了不必要的开销。通过池化,系统可以更好地应对高并发情况,降低资源竞争,提高响应速度。 什么是线程池 根据池化思想,在一个系统中,为了避免线程频繁的创建和销毁,让线程可以复用,引入了线程池的概念。线程池中,总有那么几个活跃线程。 当你需要使用线程时,可以从池子中随便拿一个空闲线程,当完成工作时,并不急着关闭线程,而是将这个线程退回到池子,方便其他人使用。 简单说就是,在使用线程池后,创建线程变成了从线程池中获得空闲线程,关闭线程编程了向池子里归还线程。 大致流程如下: ## 为什么使用线程池 Java...
Java如何创建线程池_java线程池创建-CSDN博客
在Java中创建线程池主要有以下几种方式: 1.
Java 多线程之自定义线程池(ThreadPool)使用方法
线程池是一种管理和复用线程的机制,它包含一组预先创建的线程,用于执行各种任务。线程池的主要作用是提高多线程应用程序的性能和效率,并提供对线程的生命周期和资源的管理,包括线程的创建、销毁和复用。 本文主要讨论线程池执行器(ThreadPoolExecutor)的用法,在观看本文之前建议先看线程池使用入门。 ThreadPoolExecutor 的作用是创建线程池。一般情况下,我们使用 Executors 来创建线程池,使用起来非常简单方便。但是他有一个问题,就是创建池时有很参数需要调整时他就不灵活了。Executors 创建线程池本质上也是使用 ThreadPoolExecutor ,所以我们需要了解 ThreadPoolExecutor ,因为他提供了更多和线程池管理控制功能。 下面是使用 ThreadPoolExecutor 创建线程池的示例: ThreadPoolExecutor s = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(4),...
多线程系列(十四) -一文带你搞懂线程池技术
虽然 Java 对线程的创建、中断、等待、通知、销毁、同步等功能提供了很多的支持,但是从操作系统角度来说,频繁的创建线程和销毁线程,其实是需要大量的时间和资源的。 例如,当有多个任务同时需要处理的时候,一个任务对应一个线程来执行,以此来提升任务的执行效率,模型图如下: 如果任务数非常少,这种模式倒问题不大,但是如果任务数非常的多,可能就会存在很大的问题: 1.线程数不可控:随着任务数的增多,线程数也会增多,这些线程都没办法进行统一管理 2.系统的开销很大:创建线程对系统来说开销很高,随着线程数也会增多,可能会出现系统资源紧张的问题,严重的情况系统可能直接死机 假如把很多任务让一组线程来执行,而不是一个任务对应一个新线程,这种通过接受任务并进行分发处理的就是线程池。 线程池内部维护了若干个线程,当没有任务的时候,这些线程都处于等待状态;当有新的任务进来时,就分配一个空闲线程执行;当所有线程都处于忙碌状态时,新任务要么放入队列中等待,要么增加一个新线程进行处理,要么直接拒绝。 很显然,这种通过线程池来执行多任务的思路,优势明显:...
java线程池实现多任务并发执行 - $YX$ - 博客园
import java.util.concurrent.*; /** * @Author : YuanXin * @create 2024/2/1 11:11 * @Description : */ public class Main { public static void main(String[] args) { taskListImpl taskList = new taskListImpl(); String taskJksj = taskList.poolExecutorJksj(); String taskJxdx = null; if (taskJksj.equals("taskJksjSuccess")) { taskJxdx = taskList.poolExecutorJxdx(); } if (taskJxdx.equals("taskJxdxSuccess")) { taskList.poolExecutorNbzz(); } } } class taskListImpl { // 创建一些任务 int[] taskJksj = new int[]{1,...
一文带你彻底弄懂线程池-51CTO.COM
一、前言 虽然 Java 对线程的创建、中断、等待、通知、销毁、同步等功能提供了很多的支持,但是从操作系统角度来说,频繁的创建线程和销毁线程,其实是需要大量的时间和资源的。 例如,当有多个任务同时需要处理的时候,一个任务对应一个线程来执行,以此来提升任务的执行效率,模型图如下: 图片 如果任务数非常少,这种模式倒问题不大,但是如果任务数非常的多,可能就会存在很大的问题: 1.线程数不可控:随着任务数的增多,线程数也会增多,这些线程都没办法进行统一管理 2.系统的开销很大:创建线程对系统来说开销很高,随着线程数也会增多,可能会出现系统资源紧张的问题,严重的情况系统可能直接死机 假如把很多任务让一组线程来执行,而不是一个任务对应一个新线程,这种通过接受任务并进行分发处理的就是线程池。 图片 线程池内部维护了若干个线程,当没有任务的时候,这些线程都处于等待状态;当有新的任务进来时,就分配一个空闲线程执行;当所有线程都处于忙碌状态时,新任务要么放入队列中等待,要么增加一个新线程进行处理,要么直接拒绝。 很显然,这种通过线程池来执行多任务的思路,优势明显:...
JUC--并发编程-第二部分_北岭山脚鼠鼠的博客-CSDN博客
集合类不安全 //报错 java.util.ConcurrentModificationException public class ListTest { public static void main(String[] args) { List<String> list= new CopyOnWriteArrayList<>(); //并发下Arrayist边读边写会不安全的 /** * 解决方案: * 1.List<String> list= new Vector<>(); * 2.List<String> list= Collections.synchronizedList(new ArrayList<>()); * 3.List<String> list= new CopyOnWriteArrayList<>(); */ for(int i=0;i<50;i++){ new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(list);...
Java基础(四)-CSDN博客
前言:本博客主要涉及java编程中的线程、多线程、生成者消费者模型、死锁。 目录 synchronized Lock锁 Excutors 线程多线程 创建一个简单的线程 获取执行当前代码的线程名:Thread.currentThread().getName() 开启线程:对象名.start() 守护线程 优先级 //1.创建一个继承于Thread类的子类 class MyThread extends Thread { //2.重写Thread类的run() @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } public class ThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); } } package learn12;...
谷粒商城篇章6 ---- P193-P210 ---- 异步&线程池&商品详情【分布式高级篇三】
目录 1.3.4.1 thenRunAsync 1.3.4.2 thenAcceptAsync 1.3.7.1 allOf 1.3.7.2 anyOf 1.1 初始化线程的 4 种方式 public class ThreadTest { public static void main(String[] args) { System.out.println("main...start..."); // 1.
【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序_多线程调用微服务_studyday1的博客-CSDN博客
一、线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{ @Override public void run() { System.out.println("当前线程:" + Thread.currentThread().getName()); } } 1.2 实现Runnable接口 class ThreadDemo02 implements Runnable{ @Override public void run() { System.out.println("当前线程:" + Thread.currentThread().getName()); } } 1.3 Callable接口 class MyCallable implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("当前线程:" + Thread.currentThread().getName()); return...
java多线程使用详解与案例,超详细 - 少年白马 - 博客园
1、继承Thread类 让子类继承Thread线程类 子类必须重写Thread类的run方法 创建一个自己定义的线程对象 调用start()方法启动线程 //测试类 /** * 1、让子类继承Thread线程类 */ public class ThreadTest1 extends Thread { //2、子类必须重写Thread类的run方法 @Override public void run() { for (int i = 1;i <=5;i++){ System.out.println("myThread线程输出" + i); } } } //主线程main函数 public class Main { //main方法是由一条默认的主线程负责执行的 public static void main(String[] args) { //3、创建一个自己定义的线程对象 Thread t = new ThreadTest1(); //4、启动线程 //注意是调用start方法而不是run方法,调用start方法是告诉系统要把t对象单独开一条线程...
「Java 并发编程」详解线程池实现原理及常见问题(核心线程=正式工,非核心线程=合同工)
1、 为什么要用线程池 1、提高性能:线程的创建和销毁需要消耗一定的系统资源,使用线程池可以重复利用已经创建好的线程,避免频繁地创建和销毁线程,从而提高程序的性能。 2、提高响应速度:当任务到达时,如果线程池中有空闲的线程,则可以立即执行任务,提高程序的响应速度。 3、控制并发线程数:线程池可以控制同时运行的线程数,避免由于过多的线程导致系统资源占用过多或者系统崩溃等问题。 4、提供更好的任务管理:线程池提供了更好的任务管理方式,可以方便地对任务进行管理和监控,避免任务执行出现异常或者无法处理的情况。 2、线程池工作原理 2.1 线程池任务提交过程 一个线程提交到线程池的处理流程如下图 核心线程数(正式工) 等待队列(合同工) 最大线程数(所有人员) 1)初始化线程池,线程池初始化时并没有创建corePoolSize数目的核心线程,而是惰性加载的方式。等有任务后才创建核心线程。 2)如果线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的核心线程来处理被添加的任务。...
Java 基础进阶篇(十六):多线程总结
线程(Thread)是一个程序内部的一条执行路径。我们之前启动程序执行后,main 方法的执行其实就是一条单独的执行路径。程序中如果只有一条执行路径,那么这个程序就是单线程的程序。Java 是通过 java.lang.Thread 类来代表线程的,Thread 类提供了实现多线程的方式 。 1.1 方式一:继承 Thread 类 步骤: 优缺点: 举例: public class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("子线程执行输出:" + i); } } } public class ThreadDemo1 { public static void main(String[] args) { Thread t = new MyThread(); t.start(); for (int i = 0; i < 5; i++) { System.out.println("主线程执行输出:" + i); } } }...
java 异步执行代码(先返回结果,后执行代码)
业务场景: 在用户那,角色那变更后,要更新数据,因为更新要比较长时间,需要先返回结果(2:已接收待执行)。更新结束后,再返回值结果。 (执行结果.
java语法(二)线程并发、Juit单元测试、反射机制、注解、动态代理、XML解析、JVM_芸兮的博客-CSDN博客
多线程 多线程的创建 方法一:继承Thread类,创建步骤: 定义子类MyThread继承Thread,重写run()方法 创建MyThread类对象 调用线程对象的start()方法启动线程(启动后执行的是run()方法) 这种创建方式因为已经继承了Thread类,无法继承其他类,不利于拓展。 方法二:声明一个实现Runnable接口的类。 定义定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法。 创建MyRunnable对象 把MyRunnable对象交给Thread处理 调用Thread对象的start方法启动 方法二只实现接口,可以继续继承类和实现接口,扩展性更强。但缺点是编程多一层包装(runnable对象还需要再传给thread构造thread对象) 方法一实现: public class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 5; ++i) { System.out.println("子线程执行输出:" + i); } }...
Android之 线程详解_android 主线程_12345,catch a tiger的博客-CSDN博客
一 进程 1.1 进程是针对造作系统而言的,打开运行一个应用程序就开始一个进程。对android系统而言,进程就是一个app应用。 1.2 但往往真实中启动一个程序可能并不止开启一个进程,可能还有处于后台的进程,或者其它服务进程。所以我们一般说一个程序至少有一个进程 1.3 进程间的数据是不共享的,如果需要跨进程访问数据,就要通过管道,文件, Socket套接字等技术实现跨进程通信 二 线程 2.1 线程是进程的一部分,是执行程序的最小单位,可以看作进程的一个分流 2.2 线程的作用往往是为了不影响其它线程的任务,一般用来处理独立的任务。 2.3 我们知道计算机处理代码是按照顺序执行的,如果全部在一个线程运行代码,就必须等待前面任务执行完,才能执行后面任务 2.4 这也是android不能在子线程更新UI的原因,UI更直观的展示在我们眼前,如果因为等待一个下载任务长时间更新不了UI,就会造成视觉上的卡顿,体验是非常不好的 2.5 所以android只有一个主线程(UI线程),是程序运行时候系统创建的,我们只能创建多个子线程去完成耗时任务 三 主线程 3.1...
JAVA线程池详解_清云青云的博客-CSDN博客
一.简介 线程池:一种使用线程的模式,存放了很多可以复用的线程,对线程统一管理。我们可以使用new的方式去创建线程,但若是并发线程太高,每个线程执行时间不长,这样频繁的创建销毁线程是比较耗费资源的,线程池就是用来解决此问题的。 1.使用线程池的优点 (1)降低资源的消耗:线程可以重复使用,不需要在创建线程和消耗线程上浪费资源; (2)提高响应速度:任务到达时,线程可以复用已有的线程,及时响应; (3)可管理性:无限制的创建线程会降低系统效率,线程池可以对线程进行管理、监控、调优。 二.线程池参数说明 ThreadPoolExecutor是线程池最核心的一个类,我们来看它参数最完整的构造类,代码如下: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler...
Java多线程开发CompletableFuture的应用 - 程序员xiaozhang - 博客园
做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁都爱不释手呢),好了我先简单举个列子,告诉你用它有多好。Single Dog拿一个Appointment来举个列子,如下: /** * 女神化完妆之后,还需要一小会选衣服,不过分吧。 * 也就是说我们现在有2个异步任务,第一个是化妆,第二个是选衣服。 * 选衣服要在化妆完成之后进行,这两个任务是串行 */ public static void main(String[] args) { // 线程池我前面的文章聊过,怎么配置可以去了解一下 ThreadPoolExecutor threadPool= new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new...
谷粒商城(三)_磊哥的小迷妹的博客-CSDN博客
简介 全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选,它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 REST API:天然的跨平台。 官方文档(推荐) 官方中文 社区中文1 社区中文2 1、基本概念 1、Index(索引) 动词,相当于 MySQL 中的 insert; 名词,相当于 MySQL 中的 Database 2、Type(类型) 在 Index(索引)中,可以定义一个或多个类型。 类似于 MySQL 中的 Table;每一种类型的数据放在一起; es6 之后要求一个索引只能包含一个类型 3、Document(文档) 保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格式的,Document 就像是 MySQL 中的某个...
Java网络编程 - TCP通信
TCP通信 快速入门(一发一收) TCP协议回顾: TCP通信模式: 编写客户端代码 Socket(客户端): 构造器说明 Socket(String host , int port) 创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口。 Socket类成员方法: 方法说明 OutputStream getOutputStream() 获得字节输出流对象 InputStream getInputStream() 获得字节输入流对象 public class ClientDemo { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1", 7777); OutputStream os = socket.getOutputStream(); PrintStream ps = new PrintStream(os); ps.println("我是TCP的客户端"); ps.flush(); } catch (Exception e) {...
Redis场景 | 缓存穿透、击穿问题
2023-01-31 08:37:11 由于缓存重建耗时较长,在这时间穿插线程2,3,4进入;那么这些线程都不能从缓存中查询到数据,同一时间去访问数据库,同时的去执行数据库操作代码,对数据库访问压力过大。 场景问题及原因 缓存穿透: 原因:客户端请求的数据在缓存和数据库中不存在,这样缓存永远不会生效,请求全部打入数据库,造成数据库连接异常。 解决思路: 缓存空对象 对于不存在的数据也在Redis建立缓存,值为空,并设置一个较短的TTL时间问题:实现简单,维护方便,但短期的数据不一致问题 缓存雪崩: 原因:在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决思路:给不同的Key的TTL添加随机值(简单),给缓存业务添加降级限流策略(复杂),给业务添加多级缓存(复杂) 缓存击穿(热点Key): 前提条件:热点Key&在某一时段被高并发访问&缓存重建耗时较长 原因:热点key突然过期,因为重建耗时长,在这段时间内大量请求落到数据库,带来巨大冲击 解决思路: 互斥锁...
java经典面试题JUC并发篇(持续更新)_java juc面试题_呆萌小新@渊洁的博客-CSDN博客
java经典面试题基础篇(持续更新) 1.1 java的六种线程状态 1.新建 当一个线程对象被创建,但还未调用 start 方法时处于新建状态 此时未与操作系统底层线程关联 2.可运行 调用了 start 方法,就会由新建进入可运行 此时与底层线程关联,由操作系统调度执行 3.终结 线程内代码已经执行完毕,由可运行进入终结 此时会取消与底层线程关联 4.阻塞 当获取锁失败后,由可运行进入 Monitor 的阻塞队列阻塞,此时不占用 cpu 时间 当持锁线程释放锁时,会按照一定规则唤醒阻塞队列中的阻塞线程,唤醒后的线程 进入可运行状态 5.等待 当获取锁成功后,但由于条件不满足,调用了 wait() 方法,此时从可运行状态释放锁 进入 Monitor 等待集合等待,同样不占用 cpu 时间 当其它持锁线程调用 notify() 或 notifyAll() 方法,会按照一定规则唤醒等待集合中的等 待线程,恢复为可运行状态 6.有时限等待 当获取锁成功后,但由于条件不满足,调用了 wait(long) 方法,此时从可运行状态释 放锁进入 Monitor...
Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors
线程池(重点) 线程池介绍 什么是线程池? 不使用线程池的问题: 线程池工作原理: 实现线程池的方式 谁代表线程池? 如何得到线程池对象?
JUC面试(十)--线程池&Callable接口_callable线程池_wzq_55552的博客-CSDN博客
前言 获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口 实现Runnable接口 实现Callable接口 实例化Thread类 使用线程池获取 Callable接口 这是一个函数式接口,因此可以用作lambda表达式或方法引用的赋值对象。 Callable接口,是一种让线程执行完成后,能够返回结果的 在说到Callable接口的时候,我们不得不提到Runnable接口 class MyThread implements Runnable { @Override public void run() { } } 我们知道,实现Runnable接口的时候,需要重写run方法,也就是线程在启动的时候,会自动调用的方法 同理,我们实现Callable接口,也需要实现call方法,但是这个时候我们还需要有返回值,这个Callable接口的应用场景一般就在于批处理业务,比如转账的时候,需要给一会返回结果的状态码回来,代表本次操作成功还是失败。 面试题:callable接口与runnable接口的区别? 答:(1)是否有返回值 (2)是否抛异常...
【Redis场景3】缓存穿透、击穿问题 - xbhog - 博客园
缓存穿透: 原因:客户端请求的数据在缓存和数据库中不存在,这样缓存永远不会生效,请求全部打入数据库,造成数据库连接异常。 解决思路: 缓存空对象 对于不存在的数据也在Redis建立缓存,值为空,并设置一个较短的TTL时间 问题:实现简单,维护方便,但短期的数据不一致问题 缓存雪崩: 原因:在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决思路:给不同的Key的TTL添加随机值(简单),给缓存业务添加降级限流策略(复杂),给业务添加多级缓存(复杂) 缓存击穿(热点Key): 前提条件:热点Key&在某一时段被高并发访问&缓存重建耗时较长 原因:热点key突然过期,因为重建耗时长,在这段时间内大量请求落到数据库,带来巨大冲击 解决思路: 互斥锁 给缓存重建过程加锁,确保重建过程只有一个线程执行,其它线程等待 问题:线程阻塞,导致性能下降且有死锁风险 逻辑过期...
Java - 利用Nacos做一个动态开关配置功能
我公司里有一个Config配置功能(我相信这是很普遍的一个功能)。简单来说就是: 将相关的键值对放到这个Config配置系统里面。 代码里通过这个Config配置系统的相关API,根据对应的Key拿到配置的值。在进行逻辑操作。 那么这个有啥好处呢? 我们将我们的代码发布到生产环境,往往是需要一定的流程的。可能耗时比较长。而Config配置系统的发布则非常简单。页面上点一下即可。 假如我们有一个场景:一个新老接口的替换。那么我们可以在代码里面加一个“开关”,如果为T,走新接口,如果为F,则走老接口。那么当生产上新接口出现问题的时候,我们就可以通过改变Config配置系统中的开关值为F。这样就可以在不发布代码的情况下,动态地改变程序地运行逻辑。 Config配置系统除了可以用作开关的功能以外。还有个重要的功能就如其名,配置系统,我们可以通过这个系统动态地设置相关配置。 开关同样支持分环境、分Group等操作。 自己最近也在复习微服务这块的知识。自然而然地用到了Nacos。那么Nacos不就是一个天生的配置系统吗?因此准备在其基础上稍微写个工具类,达到模拟Config配置系统的功能。...
JUC 并发编程学习笔记(总)_Java技术一点通的博客-CSDN博客
JUC 指的就是 java.util.concurrent 工具包的简称,里面的工具类可以很方便的实现多线程的开发。 java.util 工具包、包、分类。 业务:普通的线程代码 Thread。 Runnable 没有返回值、效率相比 Callable 相对较低! 2.1 进程 一个进程往往可以包含多个线程,至少包含一个。 Java默认有两个线程:一个 main, 一个GC。 2.2 线程 对于Java而言:Thread、Runable、Callable 是进行开启线程的。 Java是没有权限去开启线程的、操作硬件的,这是一个 native 的一个本地方法,它调用的底层是c++代码。 public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM.
ThreadPoolTaskExecutor和ThreadPoolExecutor_雨~旋律的博客-CSDN博客
今天在浏览代码发现前辈使用了ThreadPoolTaskExecutor,一时间有点懵,因为并不属于任何一个jdk下的线程池。后面浏览资料发现它属于Spring自带,所以根据网上博客来学习下: 首先在学习Spring自带的ThreadPoolTaskExecutor之前,我们先来回顾下老朋友:jdk下的ThreadPoolExecutor,很多人容易把这两个搞混。 这个类是JDK中的线程池类,继承自Executor, Executor 顾名思义是专门用来处理多线程相关的一个接口,所有线程相关的类都实现了这个接口,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销,提高了响应的速度。相关的继承实现类图例如ScheduledThreadPoolExecutor。 2.1、线程池接口...
阿里云(OSS)文件上传和删除_oss 删除文件夹_java-zh的博客-CSDN博客
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.0</version> </dependency> /** * 上传 * @param file * @return * @throws IOException * @throws InterruptedException */ @PostMapping("/aliyun/upload") public String aliyunUpload(MultipartFile file) throws...
java基于quasar实现协程池【后篇】_quasar 协程文档_一码超人的博客-CSDN博客
java基于quasar实现协程池【前篇】:java基于quasar实现协程池_爪哇盘古的博客-CSDN博客 在上一个文章中讲述了通过仿照java自写线程池的方式改写成quasar协程池,功能可以说实现了效果,但是遇到了一个烦恼就是在协程阻塞过程中会疯狂报警告,如果您的项目有日志文件产生当遇到一个非常耗时的任务时后面的任务阻塞产生警告,那么该日志文件的体量是致命的!所以为了摆脱这个问题,不要尝试、不要猜。要看文档!【我对英文很不友好的】 quasar纤程文档:FiberExecutorScheduler (Quasar 0.8.0) 在该文档中我发现了FiberExecutorScheduler类,这个类将是本文阐述quasar协程池的正确打开方式!【全是泪】 分析经历:我一直对Quasar及其轻质纤维替代Threads感到好奇。那么quasar本身是否有自己的纤程池呢?于是看是翻阅文档,找吧挨个看吧! 线程池ThreadPoolExecutor类的实现。 int maxThreadPoolSize = 10; ThreadPoolExecutor executor = new...
鸿蒙初学 实现视频播放_鸿蒙添加视频_蜉蝣Sakura的博客-CSDN博客
"reqPermissions": [ { "name": "ohos.permission.INTERNET" } ] <?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:alignment="center" ohos:orientation="vertical"> <Text ohos:height="match_content" ohos:width="match_content" ohos:text="AAA" ohos:text_size="30fp"/> <DirectionalLayout ohos:id="$+id:direction_layout2" ohos:height="250vp" ohos:width="match_parent" ohos:alignment="center"...
Java多线程开发工具之CompletableFuture的应用详解_java_脚本之家
做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁都爱不释手呢),好了我先简单举个列子,告诉你用它有多好。Single Dog拿一个Appointment来举个列子,如下: /** * 女神化完妆之后,还需要一小会选衣服,不过分吧。 * 也就是说我们现在有2个异步任务,第一个是化妆,第二个是选衣服。 * 选衣服要在化妆完成之后进行,这两个任务是串行 */ public static void main(String[] args) { // 线程池我前面的文章聊过,怎么配置可以去了解一下 ThreadPoolExecutor threadPool= new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new...
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with Executors.defaultThread
Contact Executors.defaultThread, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack