首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏捡田螺的小男孩

    细数线程10个坑

    日常开发中,为了更好管理线程资源,减少创建线程和销毁线程的资源损耗,我们会使用线程来执行一些异步任务。但是线程使用不当,就可能会引发生产事故。今天田螺哥跟大家聊聊线程10个坑。 大家看完肯定会有帮助的~ 线程默认使用无界队列,任务过多导致OOM 线程创建过多,导致OOM 共享线程,次要逻辑拖垮主要逻辑 线程拒绝策略的坑 Spring内部线程的坑 使用线程时,没有自定义命名 线程参数设置不合理 线程异常处理的坑 使用完线程忘记关闭 ThreadLocal与线程搭配,线程复用,导致信息错乱。 共享线程,次要逻辑拖垮主要逻辑 要避免所有的业务逻辑共享一个线程。比如你用线程A来做登录异步通知,又用线程A来做对账。 executorOne.shutdown(); } } 10.

    1.3K50编辑于 2023-02-24
  • 来自专栏林德熙的博客

    win10 uwp 线程 为什么需要线程什么是线程线程原理应用等待代码完成定时器

    如果大家有开发 WPF 或以前的程序,大概知道线程不是 UWP 创造的,实际上在很多技术都用到线程。 为什么需要线程,他是什么? 如何在 UWP 使用线程,本文就是来告诉大家这些 为什么需要线程 在程序中,创建和销毁线程是需要很多资源的,如果只是为了完成很小的代码而创建一个新的线程,创建线程占用的时间在总的运行时间占有比例很大 这样就可以省略了创建和销毁线程时间,减少了花费总时间。 什么是线程 百度说线程是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 线程就是先创建了很多线程,用户调用就是传入方法,线程拿出一个空闲的线程去执行传入的方法。 最简单的模拟代码就是创建一个线程,然后让他运行一个委托,运行完成设置这个委托为空。 应用 大家从原理可以知道,线程运行代码,不是立刻运行的,假如线程10线程,刚好都在做其他事情,这时请线程运行新的代码,就会等待线程存在空闲线程

    1.5K10发布于 2018-09-18
  • 来自专栏java跬步

    线程-线程源码详解

    在ThreadPoolExecutor的属性定义中频繁地用位移运算来表示线程状态,位移运算是改变当前值的一种高效手段,包括左移和右移。 ,最左边3位表示线程状态。 final int CAPACITY = (1 << COUNT_BITS) - 1; 8 9 // runState is stored in the high-order bits 10 /** * 根据当前线程状态,检查是否可以添加新的任务线程,如果可以则创建并启动任务 * 如果一切正常则返回true。 返回false 的可能如下: * 1.线程没有处于RUNNING状态 * 2.线程工程创建新的任务线程失败 * @param firstTask 外部启动线程时需要构造的第一个线程

    1.9K12发布于 2020-02-18
  • 来自专栏java跬步

    线程-线程的好处

    1.线程的好处。 线程使应用能够更加充分合理的协调利用cpu 、内存、网络、i/o等系统资源。 线程的创建需要开辟虚拟机栈,本地方法栈、程序计数器等线程私有的内存空间。 所以需要通过线程协调多个线程,并实现类似主次线程隔离、定时执行、周期执行等任务。线程的作用包括: 利用线程管理并复用线程、控制最大并发数等。 实现任务线程队列缓存策略和拒绝机制。 隔离线程环境。比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程,交易线程的资源消耗明显要大;因此,通过配置独立的线程,将较慢的交易服务与搜索服务隔开,避免个服务线程互相影响。 在了解线程的基本作用后,我们学习一下线程是如何创建线程的。 如果等于0,则任务执行完成后,没有任何请求进入时销毁线程线程;如果大于0,即使本地任务执行完毕,核心线程也不会被销毁。

    1.9K21发布于 2020-02-18
  • 来自专栏韩曙亮的移动开发专栏

    【Android 异步操作】线程 ( 线程作用 | 线程种类 | 线程工作机制 | 线程任务调度源码解析 )

    文章目录 一、线程作用 二、线程种类 三、线程工作机制 四、线程任务调度源码解析 一、线程作用 ---- 线程作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ---- 线程种类 : ① newCachedThreadPool : 可缓存线程 , 如果 线程线程个数已满 , 回收空闲线程 , 如果没有空闲线程 , 此时会创建新线程 ; ② newFixedThreadPool 后到的后执行 ) , LIFO 后入先出 ( 后到的先执行 ) ; 三、线程工作机制 ---- 线程线程相关概念: 线程数 : 线程的 有 最大线程数 MaxSzie , 核心线程数 CoreSize , 任务拒绝后 , 处理善后 ; 四、线程任务调度源码解析 ---- 在 AsyncTask.java 中 , 在静态代码块中 , 自己 自定义创建了线程 , 没有使用上述四种线程 ; 创建线程时传入的参数 如果 任务成功加入队列, 需要 双重检查 ( 进入该方法后, 线程可能关闭 ), 在进入该方法后, 是否添加了一个线程, 或者线程是否关闭.

    1.5K00编辑于 2023-03-28
  • 来自专栏韩曙亮的移动开发专栏

    【Android 异步操作】线程 ( 线程简介 | 线程初始化方法 | 线程种类 | AsyncTask 使用线程示例 )

    文章目录 一、线程简介 二、线程初始化方法简介 三、线程使用示例 一、线程简介 ---- 线程一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor , 合理控制并发数 , 能提高 CPU 使用效率 ; 二、线程初始化方法简介 ---- 线程初始化方法简介 : newCachedThreadPool : 创建 可缓存线程 ; 如果线程长度超过处理需要 newScheduledThreadPool : 创建 定长周期任务线程 ; 该线程支持周期性任务执行 ; newSingleThreadExecutor : 创建 单线程线程 ; 该线程只有一个工作线程 是 自己配置的线程 , 没有使用 Java 默认提供的四种线程 , Java 提供的四种线程是 可缓存线程 , 定长线程 , 定长周期任务线程 , 单线程线程 ; THREAD_POOL_EXECUTOR : 线程线程分类 : 线程线程分为 核心线程 , 非核心线程 两类 ; 非核心线程闲置时间 : 非核心线程 超过一定的闲置时间 , 就会被回收 ; 假设线程最大线程数是 8 , 核心线程

    3.7K01编辑于 2023-03-28
  • 来自专栏Alan的blog

    线程,进程

    concurrent.futures --- 启动并行任务 — Python 3.7.13 文档concurrent.futures 模块提供异步执行可调用对象高层接口异步执行可以由 ThreadPoolExecutor 使用线程或由 **Executor**ThreadPoolExecutor 线程```pythonimport concurrent.futuresimport urllib.requestURLS = ['http exc)) else: print('%r page is %d bytes' % (url, len(data)))```ProcessPoolExecutor 进程使用进程来实现异步执行调用 任何向提交更多工作的尝试, initializer 都将引发一个异常,当前所有等待的工作都会引发一个 BrokenProcessPool。 在 3.7 版更改: 添加 mp_context 参数允许用户控制由进程创建给工作者进程的开始方法 。加入 initializer 和initargs 参数。

    1.4K00编辑于 2023-05-04
  • 来自专栏落叶飞翔的蜗牛

    线程(1)——线程的使用

    int corePoolSize = 2; /* 核心线程的最大线程数 */ int maxPoolSize = 4; /* 线程最大空闲时间 */ 不推荐使用Executors的静态方法创建线程 !!! 第2节 ForkJoinPool ---- ForkJoin线程处理无返回值任务。 :" + (endTask - startTask) + "纳秒, 线程执行结果:" + future.get()); //关闭多线程 pool.shutdown(); 初始化数组用时:1847192纳秒, 初始化数组总和:493016 线程计算用时:4220889纳秒, 线程执行结果:493016 ?

    3.3K11发布于 2021-01-14
  • 来自专栏南桥谈编程

    线程线程的实现 | 日志

    像这种,提前创建好线程,需要的时候直接使用,我们称之为线程。这种本质上就是一个生产消费模型。 线程实现 //ThreadPool.hpp #pragma once #include<iostream> #include<unistd.h> #include<string> #include< lg.Enable(SCREEN_TYPE);}while(0) #define EnableFile() do{lg.Enable(FILE_TYPE);}while(0) }; 携带日志的线程设计 ThreadPool<Task> *tp=new ThreadPool<Task>(); tp->Init(); tp->Start(); int cnt=10 ; while (cnt) { // 不断地向线程推送任务 sleep(1); Task t(1,1); tp->Equeue

    57410编辑于 2024-10-02
  • 来自专栏IT技术精选文摘

    10分钟手撸Java线程

    Java线程核心原理 看过Java线程源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExecutor,而在ThreadPoolExecutor类中最核心的构造方法就是带有7 至此,我们自定义的Java线程就开发完成了。 总结 线程的核心原理其实并不复杂,只要我们耐心的分析,深入其源码理解线程的核心本质,你就会发现线程的设计原来是如此的优雅。 希望通过这个手写线程的小例子,能够让你更好的理解线程的核心原理。

    22710编辑于 2021-12-13
  • 来自专栏AI粉嫩特攻队

    线程

    线程 作用: 增加了线程的复用,降低了系统的开销 原理: 每当一个新的任务要执行的时候,系统会创建一个新的线程去执行任务,直到池中的线程数达到了设置的核心线程数,此时当新的任务要执行的时候,如果线程池中有空闲的线程 如果无法将任务加入队列(比如使用的是有界队列),则创建新的线程,如果此时线程数大于等于了线程预设的最大线程数,那么任务将被拒绝。 java.util.concurrent包对线程的支持: ExecutorService ThreadPoolExecutor (ExecutorService的默认实现类) 1、单线程线程实现 Executors.newSingleThreadExecutor 2、固定大小的线程实现 Executors.newFixedThreadPool 3、可缓存的线程实现 Executors.newCachedThreadPool 4、可定时执行任务的无大小限制的线程实现 Executors.newScheduleThreadPool

    97530发布于 2019-09-10
  • 来自专栏OSChina

    线程

    * * 二、线程的体系结构: * java.util.concurrent.Executor : 负责线程的使用与调度的根接口 * |--**ExecutorService 子接口: 线程的主要接口 * ExecutorService newCachedThreadPool() : 缓存线程线程的数量不固定,可以根据需求自动的更改数量。 * ExecutorService newSingleThreadExecutor() : 创建单个线程。 个线程 执行线程 //结果: 每个线程都要按顺序 一个一个执行,而且必须要一个线程把值返回了才执行下一个线程(闭锁) for (int i = 0; i < 10; i++) { Future 执行的结果为: " + sum); } //3 创建10线程 执行线程 //结果 ,每个线程分开操作不需要过多的等待, for (int i = 0; i < 10; i+

    93010发布于 2019-09-17
  • 来自专栏Android小知识

    线程

    什么是线程线程进行化,调用的时候直接去池里面去取,而不是每次去重新创建,不用的时候放回线程,而不是直接销毁,从而达到复用。 为什么使用线程 ①复用线程,降低创建以及销毁导致的资源消耗。 ③提高线程的可管理性,提升系统稳定性。 ThreadPoolExecutor JDK提供的线程 ThreadPoolExecutor的构造方法有七个参数 int corePoolSize核心线程数 int maximumPoolSize约定的线程最大数量 long keepAliveTime线程空闲的时候存活多久(但会保留核心线程数的线程数量) TimeUnit unit时间单位 BlockingQueue<Runnable>workQueue线程超过核心线程数的部分放到阻塞队列中 DiscardOldestPolicy最早放入的先丢弃 AbortPolicy直接抛出异常,也是默认的策略 CallerRunsPolicy谁提交的谁执行 DiscardPolicy直接丢弃 合理配置线程

    73210发布于 2021-11-24
  • 来自专栏happyJared

    线程

    为什么要用线程? 降低资源消耗。通过重复利用已创建的线程降低创建和销毁造成的消耗; 提高响应速度。当任务到达时,无须等待线程创建完成就能立即执行任务; 提高线程的可管理性。 如果要让线程执行任务,需要实现的 Runnable 接口或 Callable 接口。 如何创建线程 《阿里巴巴Java开发手册》中,强制线程不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式更加明确线程的运行规则,规避资源耗尽的风险 若有新的任务被提交到该线程,则任务会被保存在一个任务队列中,待线程空闲时,按先入先出的顺序执行队列中的任务; CachedThreadPool:该方法返回一个可根据实际情况调整线程数量的线程线程线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程;若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程进行复用。

    1.1K10发布于 2019-07-10
  • 来自专栏java_joseph

    线程

    来,随我吃透线程!!! 线程的作用 线程的创建和销毁的开销是非常大的,线程创建,直接依靠操作系统。 适用线程的场合 1服务器,服务器要收到大量请求,比如tomcat服务器,也是用线程实现的 2开发中,5个以上的线程,就可用用线程线程的创建 核心参数配置说明 参数 说明 corePoolSize 线程创建的核心线程数,线程维护线程的最少数量,即使没有任务需要执行,也会一直存活 maximumPoolSize 最大线程数量,当线程数>=corePoolSize,且任务队列已满时。 ,因为cpu的速度比io快,所以可以将核心线程数设置的多一些,10倍也可以的, 因为80个很多都是在等待io的,所以这样的话才能更好的利用cpu Brain Goetz大佬就给除了一个公式 线程数= cpu "); } } 线程实现源码 上面了解了下线程的使用注意点,现在看下线程怎么实现的 线程的组成部分 线程管理器:创建、管理线程 工作线程:就是线程池中存在的线程 任务队列:这个就是参数里重要之一的工作队列

    1.1K160编辑于 2023-08-08
  • 线程

    Java 线程的作用 现在服务器端的应用程序几乎都采用了“线程”技术,这主要是为了提高系统效率。 线程就是为了尽量减少这种情况的发生。 下面我们来看看怎么用Java实现一个线程。一个比较简单的线程至少应包含线程管理器、工作线程、任务队列、任务接口等部分。 其中线程管理器(ThreadPool Manager)的作用是创建、销毁并管理线程,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务时进行等待;任务队列的作用是提供一种缓冲机制 另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。 2.线程的组成部分 一个比较简单的线程至少应包含线程管理器、工作线程、任务列队、任务接口等部分。 线程管理器至少有下列功能:创建线程,销毁线程,添加新任务。 工作线程是一个可以循环执行任务的线程,在没有任务时将等待。

    21210编辑于 2025-08-29
  • 来自专栏网络收集

    线程

    线程基本概念线程线程本质上是一种对象,用于管理线程资源。在任务执行前,需要从线程池中拿出线程来执行。在任务执行完成之后,把线程放回线程。 核心线程(corePool) 通常状况下,线程最多能创建的线程数。当有新任务等待处理时,线程会首先判断核心线程是否已满,如果没满则创建线程执行任务。 即使有其他核心线程空闲也会创建新的核心线程来执行。任务队列(BlockQueue) 线程池中等待被线程执行的任务队列。如果核心线程已满,线程会判断队列是否已满。 最大线程(maximumPool) 任务量很大时,线程最多能创建的线程数。如果队列已满,说明当前任务量已经非常大,仅靠核心线程池内的线程数量已无法处理。 线程会判断最大线程是否已满,如果没满则创建更多线程,从等待队列首部取得任务并执行。拒绝策略(RejectedExecutionHandler) 线程拒绝过量任务的方式。

    64920编辑于 2022-08-07
  • 来自专栏Java阿呆

    线程

    为什么要用线程线程可以管理和控制线程,因为线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程可以进行统一的分配,调优和监控。 线程提供队列,存放缓冲等待执行的任务。 通过线程创建线程从调用 API 角度来说分为两种,一种是原生的线程,另外该一种是通过 Java 提供的并发包来创建,后者其实是对原生的线程创建方式做了一次简化包装,让调用者使用起来更方便,但道理都是一样的 利用Executors框架可以非常方便的创建一个线程,Java通过Executors提供四种线程,分别为: newSingleThreadExecutor:创建一个线程线程,在这个线程池中始终只有一个线程存在 每次提交一个任务就创建一个线程,直到线程达到线程的最大大小。线程的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程会补充一个新线程

    78830发布于 2020-11-04
  • 来自专栏LeetCode

    线程

    >> taskResults = new LinkedList<>(); for(int i =0; i < 10; i++){ taskResults.add( executor.submit(new CodingTask(i))); } System.out.println("10 task finashed"); //

    91700发布于 2019-03-12
  • 来自专栏weixuqin 的专栏

    线程

    目录 线程 1. 并发队列:阻塞队列和非阻塞队列 2. 线程原理:ThreadPoolExecutor 底层原理解析 3. 线程的分类 线程 1. 并发队列:阻塞队列和非阻塞队列 ? 线程的分类 1. newCachedThreadPool 可缓存线程 创建一个可缓存线程,如果线程长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 部分执行结果如下: pool-1-thread-6 pool-1-thread-11 pool-1-thread-6 pool-1-thread-10 pool-1-thread-4 pool-1-thread -11 pool-1-thread-2 2. newFixedThreadPool 定长线程 创建一个定长线程,可控制线程最大并发数,超出的线程会在队列中等待。 1-thread-1 3. newScheduledThreadPool 定时线程 创建一个定时线程,支持定时及周期性任务执行。

    1.2K10发布于 2019-09-16
领券