首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏我是业余自学C/C++的

    8.线程

    线程 进程:使多个程序能并发执行,以提高资源利用率和系统吞吐量。 引入线程,是为了救减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。 引入线程的目的 进程是可拥有资源的独立单位和可独立调度和分派的基本单位。 创建、撤销和切中,系统必须为之付出较大的时空开销。故进程,其数目不宜过多,进程切换的频率也不宜过高。 线程的属性 (1)轻型实体。线程中的实体基本上不拥有系统资源。 (2)独立调度和分派的基本单位。线程的切换非常迅速、开销小。 (3)可并发执行。 (4)共享进程资源。

    37830发布于 2019-03-12
  • 来自专栏痴者工良

    C#多线程(8):线程完成数

    也就是说,设定一个计数器,每个线程完成后,就会减去 1 ,当计数器为 0 时,代表所有线程都已经完成了任务。 Wait() 阻止当前线程,直到设置了 CountdownEvent 为止。 .Wait(); 用在一个线程中,这个线程将等待其它完成都完成任务后,才能继续往下执行。 Signal(); 用于工作线程中,向 CountdownEvent 对象发送信号,告知线程已经完成任务,然后 CountdownEvent.CurrentCount 将减去 1。 当计数器为 0 时,阻塞的线程将恢复执行。

    70430发布于 2021-04-26
  • 来自专栏开源部署

    线程应用

    1、线程调度 线程调度模型 ​ a、分时调度模型 ​ 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 ​ b、抢占式调度模型 ​ 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些 ​ Java使用的是抢占式调度模型 如何获取和设置线程优先级 ​ public final int getPriority () ​ public final void setPriority(int newPriority) 2、线程控制 ​ 线程休眠 ​ public static void sleep(long millis ) ​ 线程加入 ​ public final void join() ​ 线程礼让 ​ public static void yield() ​ 后台线程 ​ public final void setDaemon(boolean on) ​ 中断线程 ​ public final void stop() ​ public void interrupt() 3、线程的生命周期

    23310编辑于 2022-09-14
  • 来自专栏∑小熊猫的博客

    Java 多线程系列(8) —— 线程同步基础

    线程同步基础 Synchronized Synchronized 关键字提供了一种锁机制,可以实现一个简单的策略来防止线程的干扰和内存一致性错误。 ,那么会造成数据读取的错误 内存可见性 在线程写入一个数据时,会先向缓存中写入数据,稍后在写入到本地的主存中去。 这就造成了一个线程写完了,另一个线程立刻去读取写入的数据,却读取到原先的值,虽然过一段时间后,可以读到这个数据,但是却是最终一致性,而不是强一致性。 使用 volatile 后,则会立刻写入到主存中去,对其他线程可见。 但是在多线程情况下便不能保证 as-if-serial 语义。 由于线程之间数据的依赖和相互影响,我们需要告知编译器和 CPU 在什么场景下可以进行重排序,什么时候不可以进行重排序。

    43410编辑于 2022-09-26
  • 来自专栏指点的专栏

    Java 多线程8)---- 线程组和 ThreadLocal

    线程组 ThreadGroup 我们前面已经讲了线程池,并且我们知道线程池是为了在子线程中处理大量的任务,同时又避免频繁的创建和销毁线程带来的系统资源开销而产生的。 那么线程组呢? 线程组可以说是为了方便和统一多个线程的管理而产生的。我们知道,在一个 Java 程序运行的时候会默认创建一个线程,我们称其为主线程,即为执行 main 方法的线程。 () // 清除当前线程组和其子线程组,需要保证当前线程组和其子线程组中的所有线程都已经停止了 void destroy​() // 将当前线程组和其子线程组中的线程拷贝到参数指定的线程数组中 / 线程组之后,如果你没有给这个新建的线程 / 线程组指定一个父线程组,那么其默认会将当前执行创建线程 / 线程组代码的线程所属的父线程组作为新的线程 / 线程组的父线程组。 这种机制的一个典型的应用是在 Android 系统中对应的 Handler 、 Looper 组成的消息循环机制,熟悉 Android 的小伙伴们可能知道要在一个线程中创建和使用 Handler 的前提就是这个线程已经有一个对应的

    68030发布于 2019-01-18
  • 来自专栏架构师成长之路

    java(8)--线程ThreadLocal详解

    一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。 c; size++; } } } } 应用例子 如果在子线程的生命周期内,父线程修改了自己的线程局部变量值,子线程再次读取,获取的仍然是第一次读取的值。即:子线程继承父线程的值,只是在线程创建的时候继承一次。之后子线程与后父线程便相互独 八. 应用场景和意义 TTL的运用主要是根据其能提供跨线程、跨线程池依靠ThreadLocal来传递消息的特性决定的。 2、应用容器或上层框架跨应用代码给下层SDK传递信息 这种传递消息的方式,主要优势在于可以让容器层和应用层、基础服务工具层之间解耦合,并且传递的过程也是足够透明的,不会过多地侵入用户代码,其实如果能开发人员能够把控到部署平台

    8.5K20编辑于 2022-04-14
  • 来自专栏让技术和时代并行

    Java线程应用

    2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。 1. newSingleThreadExecutor 创建一个单线程线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。 每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。 如果线程池的大小超过了处理任务所需要的线程, 那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。 此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。 4.newScheduledThreadPool 创建一个大小无限的线程池。

    61830发布于 2019-04-16
  • 来自专栏dcmickey小站

    线程池的应用

    线程线程池:三大方法,七大参数,4中拒绝策略 Executors 是一个工具类,三个常用方法 // 创建一个线程 var es = Executors.newSingleThreadExecutor 如果正在运行的线程数等于corePoolSize时,则新任务被添加到队列中,直到队列满。当队列满了后,会继续开辟新线程来处理任务,但不超过最大线程数。 maximumPoolSize 最大线程池大小 keepAliveTime 当线程空闲超过keepAliveTime,非核心线程会被回收,若allowCoreThreadTimeOut为true则核心线程也会被回收 (jdk默认策略) CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。 DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。

    43710编辑于 2022-06-09
  • 来自专栏Lambda

    8.JUC线程高级-Condition和线程顺序执行

    有的时候我们希望线程按照希望的顺序依次执行,比如线程A,B,C,按照顺序依次执行,这时候就要用到阻塞和唤醒,之前的时候我们学到过wait()和nofity/notifyAll()这两个方法,这里我们使用 condition = lock.newCondition(); 要求 创建一个TestAlternate类,有三个方法loopA(),loopB(),loopC(),分别打印A,B,C 主函数中创建三个线程 /获得lock锁 private Lock lock = new ReentrantLock(); //创建三个condition对象用来await(阻塞)和signal(唤醒)指定的线程 Thread.currentThread().getName()+"-A"); number = 2;//使能第二个方法 c2.signal();//唤醒第二个线程 loopA,A2夺得了cpu执行权,结果发现此时A2的标记为number不是1,于是await,A2开始阻塞这个时候释放锁和资源,然后B,C线程得到cpu执行权按照顺序执行完毕,此时A的标志位是1,此时

    41610编辑于 2022-04-13
  • 来自专栏苏三说技术

    创建线程8 种方法

    其实,Java 提供了多种方式来创建线程,每一种都有其独特的优势和适用场景。 这篇文章将从浅入深,详细剖析 Java 创建线程8种方法,希望对你会有所帮助。 1. 使用线程线程池是一种高效的线程管理机制,可以复用线程,减少创建和销毁线程的开销。 使用 CompletableFuture CompletableFuture 是 Java 8 提供的一种异步编程工具,支持链式调用,非常适合复杂任务的分解与组合。 8. 使用 Guava 的 ListenableFuture Guava 提供了 ListenableFuture,对 Future 进行了增强,支持任务完成后的回调处理。 8 种方法,每一种方法都有其适用场景和优缺点。

    76800编辑于 2024-12-30
  • 来自专栏全栈程序员必看

    jdk8 hashmap线程安全吗_Python中的线程

    于是今天重温一个HashMap线程不安全的这个问题。 首先需要强调一点,HashMap的线程不安全体现在会造成死循环、数据丢失、数据覆盖这些问题。 即如下图中位置所示: 此时线程A中:e=3、next=7、e.next=null 当线程A的时间片耗尽后,CPU开始执行线程B,并在线程B中成功的完成了数据迁移 重点来了,根据Java A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片, 由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,从而线程不安全。 除此之前,还有就是代码的第38行处有个++size,我们这样想,还是线程A、B,这两个线程同时进行put操作时,假设当前HashMap的zise大小为10,当线程A执行到第38行代码时,从主内存中获得size

    1.2K21编辑于 2022-11-07
  • 来自专栏编程小白狼

    python 多线程应用实例

    当你需要同时执行多个任务时,Python中的多线程可以帮助你实现并发执行。以下是一个简单的示例,演示了如何在Python中使用多线程。 import threading import time # 定义一个函数作为线程的目标函数 def print_numbers(): for i in range(5): print = threading.Thread(target=print_numbers) # 启动线程 thread1.start() thread2.start() # 等待线程执行结束 thread1 然后创建了两个线程thread1和thread2,并分别将print_numbers函数设置为它们的目标函数。通过调用start方法来启动线程,然后使用join方法等待线程执行结束。 需要注意的是,由于全局解释器锁(GIL)的存在,Python中的多线程并不能实现真正的并行执行,但对于I/O密集型的任务,多线程仍然可以提供性能上的优势。

    29710编辑于 2024-12-31
  • 来自专栏码云大作战

    线程应用 - 中断interrupt详解

    有些初学者对中断的概念可能会有些许小误会,比如线程调用Thread.interrupt()方法,就认为线程会被中断,停止执行,其实不是这样的,让我们来看下中断interrupt详解。 ),则会抛出异常,后续如果线程不想继续被操作,可以利用这个异常来让线程运行退出,比如for循环的break,或者直接return。 ,如果当前线程已经中断则返回true,否则返回false。 结果发现,线程是否被中断检测方法返回了true。 上述结果发现,线程在调用Thread.sleep后并没有被中断。加入isInterrupted方法观察线程中断标志位情况: ? ?

    1.5K20发布于 2020-08-26
  • 来自专栏奔跑的键盘侠

    关于多线程应用

    如果有几十万个甚至百万级别的,排队切换的时间就不能忽略不计了,这个时候就可以考虑多线程了。 这就是今天的内容,代码如下: #! /usr/bin/env python3.6 # _*_ coding:utf-8 _*_ # __author__: Ed Frey # DATE: 2019/2/28 import threading getDown_urllib(url, file_path,error_path,videoName): ………… #method of downloading def getVideo_urllib(url_m3u8, if __name__ == '__main__': main() 中间实现的函数就隐藏了,看了会眼花,有感兴趣的小伙伴可以私信我获取,主要还是线程的调用方式,class MyThread(threading.Thread )继承一个线程的类,然后main()中设置多个线程,再运行。

    55130发布于 2019-07-04
  • 来自专栏Devops专栏

    8.Condition 控制线程通信

    8.Condition 控制线程通信 前言 前一篇我们讲述了 同步锁 Lock,那么下面肯定就要讲解一下 同步锁 Lock 如何控制线程之间的通讯。 这些就是控制线程间通讯的方法。 wait() 与 notify() 和 notifyAll() **wait()**:令当前线程挂起并放弃CPU、同步资源并等待,使别的线程可访问并修改共享资源,而当前线程排队等候其他线程调用notify wait() 方法 在当前线程中调用方法:对象名.wait() 使当前线程进入等待(某对象)状态 ,直到另一线程对该对象发出 notify (或notifyAll) 为止。 image-20201103220804721 7.4 测试执行 在生产与消费方法中,使用 while 解决了 虚假唤醒之后,下面来执行看看,如下: image-20201103220928349 8.

    50410编辑于 2022-03-23
  • 来自专栏算法

    创建线程8种方法

    创建线程8种方法 1. 继承Thread类 最直接的方式是创建一个继承自Thread类的子类,并重写其run()方法。 System.out.println("线程返回结果:" + futureTask.get()); } } 优点: 支持返回值和异常处理。 使用线程线程池是一种高效的线程管理机制,可以复用线程,减少开销。 8. 使用Guava的ListenableFuture Guava的ListenableFuture是对Future的增强,支持任务完成后的回调处理。 总结 以上就是Java中创建线程8种方法,每一种方法都有其适用场景和优缺点。希望大家在实际开发中,能根据场景选择合适的方式。

    45010编辑于 2025-01-02
  • 来自专栏彤哥读源码

    死磕 java线程系列之创建线程8种方式

    问题 (1)创建线程有哪几种方式? (2)它们分别有什么运用场景? 简介 创建线程,是多线程编程中最基本的操作,彤哥总结了一下,大概有8种创建线程的方式,你知道吗? ); }).start(); }} 使用匿名类的方式,一是重写Thread的run()方法,二是传入Runnable的匿名类,三是使用lambda方式,现在一般使用第三种(java8+ ,可以复用线程,节约系统资源。 并行计算(Java8+) public class CreatingThread07 { public static void main(String[] args) { List ; (7)并行计算(Java8+); (8)Spring异步方法; 彩蛋 上面介绍了那么多创建线程的方式,其实本质上就两种,一种是继承Thread类并重写其run()方法,一种是实现Runnable接口的

    37200发布于 2019-10-10
  • 来自专栏Linyb极客之路

    线程应用场景

    线程使用的目的: 1、 吞吐量:做WEB,容器帮你做了多线程,但是它只能帮你做请求层面的,简单的说,就是一个请求一个线程(如struts2,是多线程的,每个客户端请求创建一个实例,保证线程安全),或多个请求一个线程线程的使用场景: 1、 常见的浏览器、Web服务(现在写的web是中间件帮你完成了线程的控制),web处理请求,各种专用服务器(如游戏服务器) 2、 servlet多线程 3、 FTP下载,多线程操作文件 4、 数据库用到的多线程 5、 分布式计算 6、 tomcat,tomcat内部采用多线程,上百个客户端访问同一个WEB应用,tomcat接入后就是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用我们的 servlet程序,比如doGet或者dpPost方法 7、 后台任务:如定时向大量(100W以上)的用户发送邮件;定期更新配置文件、任务调度(如quartz),一些监控用于定期信息采集 8、 自动作业处理 ,多任务的分割,由一个主线程分割给多个线程完成 13、desktop应用开发,一个费时的计算开个线程,前台加个进度条显示 14、 swing编程 举一个小栗子: 一个文本文件有100M,全是字符串,我要执行切分字符串

    57920发布于 2018-08-06
  • Java EE(8)——线程安全——锁策略&CAS

    本文内容 1.锁策略:乐观/悲观,轻量/重量,自旋/挂起等待,读写,公平/非公平,可重入/不可重入,其他锁策略,Callable 2.CAS:原理,应用(原子类,自旋锁),ABA 3.JUC(java.util.concurrent (这需要额外的数据结构来实现,比如记录线程阻塞的时间,放进优先级队列中),在锁释放后按照先来后到的顺序获取锁 非公平锁:锁释放后操作系统会唤醒一个或者多个线程,这些线程同时竞争锁,不关心是哪个线程能获取锁 CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线 程只会收到操作失败的信号 2.2CAS应用 2.2.1实现原子类 标准库中提供了java.util.concurrent.atomic 取款过程如下: 存款100:线程1获取到当前存款值为100, 期望更新为50;线程2获取到当前存款值为100,期望更新为 50 线程1执行扣款成功,存款被改成50;线程2阻塞等待中 在线程2执行之前 , 期望更新为50;线程2获取到当前存款值为100,期望更新为 50 版本2: 线程1执行扣款成功,存款被改成50;线程2阻塞等待中 版本3: 在线程2执行之前,滑稽的朋友给他转账50,余额又变回

    10810编辑于 2026-01-13
  • 来自专栏邢成的架构笔记

    线程池参数原理及应用

    ,自然有对线程的管理池即线程池。 ,这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去! :线程池最大线程数,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程; keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。 默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize return 0; } } } 运行结果: 可以看到15个耗时的操作很快就并行执行完成,并且还能返回执行的成功结果数 以上就是我对线程池的理解和应用

    58430编辑于 2022-01-04
领券