首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Java帮帮-微信公众号-技术文章全总结

    Java多线程详解6【面试+工作

    Java多线程详解【面试+工作】 Java线程:新特征-原子量 所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。 :新特征-原子量 * * @author leizhimin 2009-11-6 9:53:11 */ publicclass Test { publicstaticvoid main(String pool.execute(t4); pool.execute(t5); pool.execute(t6) 600,lock); Runnable t5 = new MyRunnable("老牛", 1300,lock); Runnable t6 pool.execute(t4); pool.execute(t5); pool.execute(t6)

    73670发布于 2018-03-15
  • 来自专栏高性能服务器开发

    (一)主线程工作线程的分工

    服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1、B2、B3、B4,这些工作线程处理这些新连接上的网络 这里我们将线程A称为主线程,B1、B2、B3、B4等称为工作线程工作线程的代码框架一般如下: while (! 线程A接收的新连接,可以根据一定的负载均衡原则将新的socket fd分配给工作线程。 如此反复,也就是说线程A记录了各个工作线程上的socket fd数量,这样可以最大化地来平衡资源,避免一些工作线程“忙死”,另外一些工作线程“闲死”的现象。 3. 即使工作线程不满载的情况下,也可以让工作线程做其他的事情。比如现在有四个工作线程,但只有三个连接。那么线程B4就可以在handle_other_thing()做一些其他事情。

    2.2K90发布于 2018-04-04
  • 来自专栏痴者工良

    C#多线程(6):线程通知

    这一篇将学习 C# 中用于发送线程通知的 AutoRestEvent 类。 AutoRestEvent 类 用于从一个线程向另一个线程发送通知。 微软文档是这样介绍的:表示线程同步事件在一个等待线程释放后收到信号时自动重置。 其构造函数只有一个: 构造函数里面的参数用于设置信号状态。 线程通过调用 WaitOne() 方法,等待信号; 另一个线程可以调用 Set() 通知 AutoResetEvent 释放等待线程。 复杂一点的示例 我们设计一个程序: Two 线程开始处于阻塞状态; 线程 One 可以设置线程 Two 继续运行,然后阻塞自己; 线程 Two 可以设置 One 继续运行,然后阻塞自己; ? 另外,线程中使用 WaitOne() ,另一个线程使用 Set() 通知后, AutoResetEvent 对象会自动恢复非终止状态,不需要线程使用 Reset() 。

    1.2K51发布于 2021-04-26
  • 来自专栏指点的专栏

    Java 多线程6)----线程池(上)

    前言 在前面的系列文章中,我们介绍了一下 Java 中多线程的一些主要的知识点和多线程并发程序的设计和处理思想。包括线程的介绍、生命周期、线程的运行控制。 我们将生产者看做是一个线程,这个线程专门向这个产品队列中提供已经成熟的产品; 我们将消费者也看作是一个线程,这个线程专门从这个产品队列中取出生产者线程提供的产品。 3、最后,为了保证产品队列中数据的正确性,在生产者线程和消费者线程在进入产品队列输送 / 取出产品之前,线程应该获取产品队列中的锁资源,没有获取产品队列的锁资源的线程不能进入产品队列中执行操作,即同一个时刻生产者线程和消费者线程不能同时进入产品队列中执行操作 但其实使用无界的阻塞队列是非常不安全的:试想一下,假设我们有多个生产者线程,而仅有一个消费者线程,或者说生产者线程的生产速度远大于消费者线程的消费速度,那么如果不对队列最大元素数加以限制,很可能生产者线程会把计算机内存资源耗光 SynchronousQueue 不储存元素的阻塞队列,每个生产者线程必须等待另一个消费者线程的执行,同理,每个消费者个线程必须等待另一个生产者线程的执行,因此队列中没有元素。

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

    Java(6)-java线程

    线程是一个单独程序流程。多线程是指一个程序可以同时运行多个任务,每个任务由一个单独的线程来完成。也就是说,多个线程可以同时在一个程序中运行,并且每一个线程完成不同的任务。 程序可以通过控制线程来控制程序的运行,例如线程的等待、休眠、唤起线程等。 一. 线程的基本知识 线程是程序运行的基本单位,一个程序中可以同时运行多个线程。 Java 程序可同时并行运行多个相对独立的线程。例如创建一个线程来接收数据,另一个线程发送数据,既使发送线程在接收数据时被阻塞,接受数据线程仍然可以运行。 线程是相互独立的,每个方法的局部变量和其他线程的局部变量是分开的,因此,任何线程都不能访问除自身之外的其他线程的局部变量。 举个例子,Web服务器中的Servlet,在容器启动时,后台都会初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来,调度线程就会从线程池中取出一个工作线程来处理该请求,从而实现并发控制的目的

    3.5K21编辑于 2022-04-14
  • 来自专栏ClearSeve

    MFC 用户线程工作线程

    用户线程 AfxBeginThread 创建线程 AfxEndThread 结束线程 添加类->父类是CWndThread 在CWndThread::InitInstance()函数中实现窗口 1)定义类 1.定义窗口类对象 2.将窗口对象设置为主窗口 3.显示窗口 CMyDialog Dlg; m_pMainWnd = &Dlg; Dlg.DoModal(); 2)创建用户线程 CuserThread * pThread = (CuserThread*)AfxBeginThread(RUNTIME_CLASS(CuserThread));//创建线程 工作线程 AfxBeginThread 创建线程 AfxEndThread 结束线程 1.定义线程处理函数 函数格式 static UINT Thread(LPVOID pParam);//需要是静态成员函数 2.创建线程 AfxBeginThread (XXX,this); 在线程内使用成员变量的方法:(将pParam强转成类地址) XXXClasName* pThis = (XXXClasName*)pParam;

    53220编辑于 2022-02-10
  • 来自专栏程序员互动联盟

    线程池】线程池与工作队列

    AWT 和 Swing 就使用这个模型,在这个模型中有一个 GUI 事件线程,导致用户界面发生变化的所有工作都必须在该线程中执行。 因此,Swing 应用程序经常需要额外的工作线程,用于运行时间很长的、同 UI 有关的任务。 每个任务对应一个线程方法和单个后台线程(single-background-thread)方法在某些情形下都工作得非常理想。每个任务一个线程方法在只有少量运行时间很长的任务时工作得十分好。 而只要调度可预见性不是很重要,则单个后台线程方法就工作得十分好,如低优先级后台任务就是这种情况。 我们通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和 notify() 来通知等待线程新的工作已经到达了。该工作队列通常被实现成具有相关监视器对象的某种链表。

    1.3K80发布于 2018-03-16
  • 来自专栏java学习java

    异步模式之工作线程

    定义 让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现 就是线程池,也体现了经典设计模式中的享元模式。 例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那 么成本就太高了(对比另一种多线程设计模式:Thread-Per-Message) 注意,不同任务类型应该使用不同的线程池 饥饿 固定大小线程池会有饥饿现象 两个工人是同一个线程池中的两个线程 他们要做的事情是:为客人点餐和到后厨做菜,这是两个阶段的工作 客人点餐:必须先点完餐,等菜做好,上菜,在此期间处理点餐的工人必须等待 上菜宫保鸡丁2 创建多少线程池合适 线程池的大小应根据具体的应用场景和系统需求来确定。以下是一些建议供参考: 考虑系统资源:线程池的大小应该与系统可用的资源相匹配。 考虑任务类型:不同类型的任务对线程池的需求量不同。

    49430编辑于 2023-10-15
  • 来自专栏码匠的流水账

    线程工作窃取实例

    序 本文主要来展示一下简版的work stealing线程池的实现。

    1.1K10发布于 2018-09-17
  • 来自专栏全栈程序员必看

    Windows线程漫谈界面线程工作线程

    大家好,又见面了,我是全栈君 每个系统都有线程,而线程的最重要的作用就是并行处理,提高软件的并发率。针对界面来说,还能提高界面的响应力。 线程分为界面线程工作线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列”,“消息队列”也是界面线程工作线程的最大区别,这个词应该进到你的脑子里,根深蒂固的! ,我们就要注意线程的同步问题了,线程的同步一般来说,是在多个线程共用了资源的时候。 上面已经说了线程的创建、管理(退出线程、等待线程)、同步等,那我们发现了什么共性呢?作为一个程序员,我们要很敏感的发现这些代码上的共性,这是我们设计代码的主要前提。 // 启动线程线程所需要的参数从这里传进 BOOL End(); // 结束线程 virtual void Run(); // 重写Run函数 hovertree.com 所以整个的线程封装成以下的类

    91120编辑于 2022-07-15
  • 来自专栏石云升

    《深度工作》学习笔记(6

    1、人不能一直保持深度工作,人的精力毕竟有限。通过给自己一段安逸的不消耗精力的时间来调整自己的状态。 但未完成的任务,会吸引我们的注意力。导致我们注意力的浪费。这种效应又被叫为”蔡加尼克效应“。 想要克服这种效应,可以使用“假装工作做完了”,意思就是,把每天的任务做一个阶段性的了结,未能完成的制定下一阶段的完成计划。现在很多协同工具都会有任务进度的展示。工作时,努力工作。 2、每个人都有工作习惯,与其在工作中抽时间专注,不如在专注中抽时间分心。这里的关键点是你大部分时间是专注的,还是分心的。一个好的生活习惯能让你更快、更久的进入深度工作。 在深度工作的书里讲的是用扑克牌来隐射,通过记住每一张扑克牌对应的人或者物,再通过这些人或者物来记忆生活中的人或物。场景越夸张越容易记忆。

    31930编辑于 2022-08-25
  • 来自专栏存储内核技术交流

    redis 6线程模型

    redis 多线程架构 redis6之前的版本一直单线程方式解析命令、处理命令,这样的模式实现起来简单,但是无法使用多核CPU的优势,无法达到性能的极致;到了redis 6,redis6采用多线程模式来来读取和解析命令 ,但是命令的执行依然通过队列由主线程串行执行,多线程的好处是分离了命令的解析和命令执行,命令的解析有独立的IO线程进行,命令执行依旧有main线程执行,多线程增加了代码的复杂度 开启多线程模型 Redis.conf */ } 在redis-server中的该配置表现为三个字段 启动redis并查看多线程 redis-server thread:从队列中取出数据一次执行命令 bio_aof_fsync thread :page cache中的aof数据fsync到磁盘的线程 io_thd thread: 从tcp中读取命令同时解析命令 多线程主逻辑 int main(int argc, char **argv) { // 加载配置文件 loadServerConfig(configfile,options); //主线程逻辑初始化,启动aeCreateFileEvent/beforeSleep

    59520编辑于 2022-08-17
  • 来自专栏喵叔's 专栏

    6搞懂线程池(二)

    我们向线程池中放入一个耗时长的操作。它会运行 6 秒钟,如果成功完成则会设置一个 ManualResetEvent 信号类。在其他情况下,比如需要取消该操作,那么该操作会被丢弃。 这是因为操作会花费 6 秒来完成,只能取消该操作。所以如果提供 7 秒的超时时间是可行的,该操作会顺利完成。在有大量线程处于阻塞状态等待线程事件信号时这种方式非常有用。 显式指出该后台工作线程支持取消操作及该操作进度的通知。我们还定义了三个事件,当事件发生时会调用响应的事件处理器。每当事件通知订阅者时就会将具有特殊的定义签名的方法将被调用。 我们定义的 DoWork 事件会在后台工作对象通过 RunWorkerAsync 方法启动一个异步操作时被调用。 BackgroundWorker 主要用于 WPF 中,通过后台工作事件处理器代码可以直接与 UI 控制器交互。

    81210发布于 2020-09-08
  • 来自专栏犀利豆的技术空间

    线程池 execute() 的工作逻辑

    最近在看《Java并发编程的艺术》回顾线程池的原理和参数的时候发现一个问题,如果 corePoolSize = 0 且 阻塞队列是无界的。线程池将如何工作? 我们先回顾一下书里面描述线程池execute()工作的逻辑: 如果当前运行的线程,少于corePoolSize,则创建一个新的线程来执行任务。 { return c & CAPACITY; } // 根据工作线程数和线程池状态获取 ctl private static int ctlOf(int rs, int wc) 如果线程池处于 Running状态,则检查工作线程(worker)是否为0。如果为0,则创建新的线程来处理任务。如果启动线程数大于maximumPoolSize,任务将被拒绝策略拒绝。 线程池将如何工作? 这个问题应该就不难回答了。 最后 《Java并发编程的艺术》是一本学习 java 并发编程的好书,在这里推荐给大家。

    1.5K20发布于 2018-10-11
  • 来自专栏Java3y

    线程池是怎样工作

    线程池的重点之一就是控制线程资源合理高效的使用,所以必须控制工作线程的个数,所以需要保存当前线程池中工作线程的个数。 看到这里,你是否觉得需要用两个变量来保存线程池的状态和线程池中工作线程的个数呢? 还是跟工作线程的个数有关,每一个线程在取任务的时候,线程池会比较当前的工作线程个数与核心线程数: 如果工作线程数小于当前的核心线程数,则使用第一种方法取任务,也就是没有超时回收,这时所有的工作线程都是“ 6、拒绝策略 虽然我们有了阻塞队列来对任务进行缓存,这从一定程度上为线程池的执行提供了缓冲期,但是如果是有界的阻塞队列,那就存在队列满的情况,也存在工作线程的数据已经达到最大线程数的时候。 除此之外,会尝试通过 CAS 来自增工作线程的个数,如果自增成功了,则会创建新的工作线程,即 Worker 对象。 然后加锁进行二次验证是否能够创建工作线程,最后如果创建成功,则会启动该工作线程。 3、启动工作线程工作线程创建成功后,也就是 Worker 对象已经创建好了,这时就需要启动该工作线程,让线程开始干活了,Worker 对象中关联着一个 Thread,所以要启动工作线程的话,只要通过

    61210发布于 2019-08-27
  • NodeJS工作线程Worker使用简介

    NodeJs为异步单线程模型,其中如果主线程如果执行比较耗CPU的操作,可能会失去响应,因此工作线程(Worker)对于执行 CPU 密集型 JavaScript 操作非常有用。 worker_threads模块允许使用并行执行 JavaScript 的线程。模块包含跟worker线程通信的接口。 isMainThread) {//在worker线程 //获取host传来的参数 const data = workerData; //进行一些高CPU的操作 //如:排序

    1.3K10编辑于 2024-01-18
  • 专用工作线程

    该脚本也可以再请求其他脚本,但一个线程总是从一个脚本源开始。创建专用工作线程创建专用工作线程最常见的方式是加载 JavaScript 文件。 换句话说,与活动的专用工作线程关联的 Worker 对象和与终止的专用工作线程关联的 Worker 对象无法分别。初始化时,虽然工作线程脚本尚未执行,但可以先把要发送给工作线程的消息加入队列。 除了路径解析不同,创建子工作线程与创建普通工作线程是一样的。子工作线程的脚本路径根据父工作线程而不是相对于网页来解析。 工作线程数据传输使用工作线程时,经常需要为它们提供某种形式的数据负载。工作线程是独立的上下文,因此在上下文之间传输数据就会产生消耗。 通过使用特定于任务的线程池,可以分配固定数量的工作线程,并根据需要为他们提供参数。工作线程会接收这些参数,执行耗时的计算,并把结果返回给线程池。然后线程池可以再将其他工作分派给工作线程去执行。

    94410编辑于 2024-08-05
  • 来自专栏落跑架构师M

    java线程池,工作窃取算法

    这边会用“工作者”来代替线程的说法,如果在java中这个工作者就是线程工作窃取核心思想是,自己的活干完了去看看别人有没有没干完的活,如果有就拿过来帮他干。 我们来看一张图,这张图是发生了工作窃取时的状态。 可以看到工作者B的本地队列中没有了需要执行的规则,它正尝试从工作者A的任务队列中偷取一个任务。 为什么说尝试? Java中的工作窃取算法线程池 在Java 1.7新增了一个ForkJoinPool类,主要是实现了工作窃取算法的线程池,该类在1.8中被优化了,同时1.8在Executors类中还新增了两个newWorkStealingPool 256 使用工作窃取算法的线程池来优化之前的代码 ExecutorService executor = Executors.newWorkStealingPool(8); for (int i = ForkJoinPool中的工作队列,工作窃取都是需要额外管理的,同时也对线程调度和GC带来了压力。 所以ForkJoinPool并不是万能药大家根据具体需要去使用。

    99020发布于 2019-12-30
  • 来自专栏落跑架构师M

    java线程池,工作窃取算法

    这边会用“工作者”来代替线程的说法,如果在java中这个工作者就是线程工作窃取核心思想是,自己的活干完了去看看别人有没有没干完的活,如果有就拿过来帮他干。 我们来看一张图,这张图是发生了工作窃取时的状态。 可以看到工作者B的本地队列中没有了需要执行的规则,它正尝试从工作者A的任务队列中偷取一个任务。 为什么说尝试? Java中的工作窃取算法线程池 在Java 1.7新增了一个ForkJoinPool类,主要是实现了工作窃取算法的线程池,该类在1.8中被优化了,同时1.8在Executors类中还新增了两个newWorkStealingPool 256 使用工作窃取算法的线程池来优化之前的代码 ExecutorService executor = Executors.newWorkStealingPool(8); for (int i = ForkJoinPool中的工作队列,工作窃取都是需要额外管理的,同时也对线程调度和GC带来了压力。所以ForkJoinPool并不是万能药大家根据具体需要去使用。

    1.1K21发布于 2020-02-11
  • Electron——如何使用nodejs工作线程

    前言 在electron中如何使用nodejs的工作线程,Demo代码 代码 工作线程 // workerThreads.js const { Worker, isMainThread, parentPort

    63910编辑于 2024-08-15
领券