线程阻塞

Java多线程同步屏障CyclicBarrierDemo对象

情到浓时终转凉″ 提交于 2020-03-16 18:05:58
一、概述 同步屏障可以使多条线程彼此等待,直到抵达某个公共的屏障点。线程之间彼此等待时已经抵达公共屏障点的线程不会继续往下执行,会在所有线程抵达公共屏障点之前一直阻塞。CyclicBarrierDemo对象可以重用,这点与上一篇中的CountDownLatch对象不同,CountDowLatch时不可重用的。 二、主要方法 CyclicBarrier(int parties):初始化一个包含指定parties数目的CyclicBarrier对象 int await() throws InterruptedException, BrokenBarrierException:强制阻塞线程,一直等待所有的parties线程都在同步屏障上调用了await()方法 int await(long time, DateUtil util):指定线程的等待时间,如果超时会抛出异常 void reset():重置对象,如果此时有线程在这个对象上阻塞,则会抛出异常 int getNumberWaiting(): 返回阻塞的线程数量。 三、代码示例 高速公路的建造:高速公路的建造不是从头到尾建造的,高速公路在规划后之后,会将规划路线分段施工,一般情况下一条完整的高速公路在施工时是好几段同时施工的。下面我们使用CyclicBarrierDemo对象来实现建造一条完整高速公路的场景。 如上图中所示

进程&线程 同步异步&阻塞非阻塞

六月ゝ 毕业季﹏ 提交于 2020-03-16 14:27:49
2015-08-19 15:23:38 周三 线程 线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 一条线程指的是进程中一个单一顺序的 控制流 ,一个进程中可以并行多个线程,每条线程并行执行不同的任务 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文 join();可以用来邀请其他线程先执行 yield();告诉系统"把自己的CPU时间让掉,让其他线程或者自己运行" 同步异步&阻塞非阻塞 1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。 2. 异步,就是 我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知) 3. 阻塞, 就是调用我(函数),我 (函数)没有接收完数据或者没有得到结果之前

线程池(ThreadPool)使用和原理

房东的猫 提交于 2020-03-16 12:40:52
通常我们构建线程池一般使用这种方式 ExecutorService executorService = Executors.newFixedThreadPool(4); //固定线程池 但是阿里开发手册上面建议使用以下方式 ThreadPoolExecutor(int corePoolSize, //核心线程池 int maximumPoolSize, //最大线程池 long keepAliveTime, //超时时间 TimeUnit unit, //时间单位 BlockingQueue<Runnable> workQueue, //队列 ThreadFactory threadFactory, //线程工厂 RejectedExecutionHandler handler) //拒绝策略 其实两种构建线程池的方式并没有什么本质的区别,阿里推荐的方式只是为了让线程池构建清楚的知道线程池的参数,避免过度内存开销和浪费 线程池五种状态 下面我们就分析下线程池工作的流程 executorService.execute(new Thread()); executorService.shutdown(); public void execute(Runnable command) { if (command == null) throw new NullPointerException(

线程池(一)

泪湿孤枕 提交于 2020-03-16 12:39:37
Executor 线程池顶级接口。定义方法,void execute (Runnable)。方法调用者提供Runnable接口的实现,线程池通过线程执行这个Runnable。服务方法无返回值的,是Runnable接口中的run方法无返回值。 作用是: 启动线程任务的。 ExecutorService Executor接口的子接口。提供了一个新的服务方法,submit。有返回值(Future类型)。submit方法提供了overload方法。其中有参数类型为Runnable的,不需要提供返回值的;有参数类型为Callable,可以提供线程执行后的返回值。 - void execute(Runnable), Future submit(Callable), Future submit(Runnable) Future 未来结果,代表线程任务执行结束后的结果。 获取线程执行结果的方式是通过get方法获取的。get无参,阻塞等待线程执行结束,并得到结果。get有参,阻塞固定时长,等待线程执行结束后的结果,如果在阻塞时长范围内,线程未执行结束,抛出异常。 常用方法: T get() T get(long, TimeUnit) Callable 可执行接口。 类似Runnable接口。也是可以启动一个线程的接口。其中定义的方法是call

线程池原理分析

不想你离开。 提交于 2020-03-16 12:39:04
线程池原理分析 应用线程池代码 public class ThreadPoolDemo implements Runnable{ static ExecutorService executorService = Executors.newFixedThreadPool(3); @Override public void run() { try { TimeUnit.SECONDS.sleep(10); } catch (Exception e) { e.printStackTrace(); } System.out.println("name:" + Thread.currentThread().getName()); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { ThreadPoolDemo threadPoolDemo = new ThreadPoolDemo(); executorService.execute(threadPoolDemo); } executorService.shutdown(); } } 线程池创建大致分为5种: static ExecutorService executorService = Executors.newFixedThreadPool

线程池与非线程池应用场景及模型对比分析

喜欢而已 提交于 2020-03-16 11:59:44
某厂面试归来,发现自己落伍了!>>> 在网络编程中经常用到线程池和连接池,今天就对其中常用的线程池的基本应用场景和模型做个简单的对比分析。 1、 业务流程对比 a、 非线程池业务流模型: 上图标识了基本的非线程池的线程模型,前端 1 有多少连接则前端客户端 2 与前端服务器端 3 均需建立一对一的线程数进行响应的连接。前端服务器端 3 与后端服务器端 4 也需建立响应数目的线程进行连接处理相关业务。 当一个任务处理完毕后线程退出,在下一个任务到来的时候前端服务器端创建新的线程来处理新的任务。 b 、线程池模型: 上图标识了基本的线程池模型。前端客户端大量的连接通过服务端的任务接收线程将连接任务放入前端服务器端的任务队列中,前端服务器端起固定数量的处理线程处理前端的任务,当处理线程处理完任务后从任务队列中获取下一个处理任务。保证了前端服务器端和后端服务器端的连接数不会超过前端服务器端的处理任务线程数 n ,从而保证了后端服务器端的压力。 当处理线程处理完一个任务而任务队列中没有任务的时候线程并不退出,阻塞等待新的任务。 通过上图可以看出,当前端服务器端通过设置合理的处理线程数和任务队列大小,可以有效的屏蔽前端客户端高并发量对后端服务器端的冲击。 2、 应用场景分析对比 a、 非线程池模型 适用于单次连接任务执行时间较长,并发量不高的情况。一旦并发量很高则线程频繁创建的开销是巨大的。

手动实现线程池 ThreadPool

你说的曾经没有我的故事 提交于 2020-03-16 11:56:41
Executors提供了三个经典的线程池创建方式 ExecutorService threadPool = Executors.newFixedThreadPool(int) ExecutorService threadPool = Executors.newSingleThreadPool() ExecutorService threadPool = Executors.newCachedThreadPool(int) 那我们在工作中到底用哪一个呢? 答案是我们在生产上只能用自定义的 根据图中我们可以发现他们得底层实现都是用了ThreadPoolExecutor,然而第五个参数使用到的阻塞队列默认值是Integer.MAX_VALUE,也就是 2147483647,这样就相当于是一个无界的队列。所有的请求都往里塞,最终造成OOM。 根据阿里编码规范也可以看出 参数说明 线程池底层实现的7大参数 1.corePoolSize:线程池中的常驻核心线程数 2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1 3.keepAliveTime:多余的空闲线程的存活时间 4.unit:keepAliveTime的单位 5.workQueue:任务队列,被提交但尚未被执行的任务。 6.threadFactory:表示生成线程池中工作线程的线程工厂

Linux 多线程通信

帅比萌擦擦* 提交于 2020-03-16 06:44:37
Linux 多线程通信 2008-03-13 11:01 19764人阅读 评论 (0) 收藏 举报 linux 多线程 thread join windows 编程 摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用mutex。可以参考一些比较新的UNIX/Linux编程的书,都会提到Posix线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间通信,线程用不上。 linux用pthread_kill对线程发信号。 另:windows下不是用post..(你是说PostMessage吗?)进行线程通信的吧? windows用PostThreadMessage进行线程间通信,但实际上极少用这种方法。还是利用同步多一些 LINUX下的同步和Windows原理都是一样的。不过Linux下的singal中断也很好用。 用好信号量,共享资源就可以了。 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式

Netty源码—一、server启动(1)

淺唱寂寞╮ 提交于 2020-03-16 05:26:12
说明:netty源码系列是基于4.1.25版本的netty源码的 Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网络编程更简单。 在介绍Netty服务器启动之前需要简单了解两件事: reactor线程模型 linux中的IO多路复用 reactor线程模型 关于reactor线程模型请参考 这篇文章 ,通过不同的配置Netty可以实现对应的三种reactor线程模型 reactor单线程模型 reactor多线程模型 reactor主从多线程模型 // reactor单线程模型,accept、connect、read、write都在一个线程中执行 EventLoopGroup group = new NioEventLoopGroup(1); bootStrap.group(group); // reactor多线程,accept在bossGroup中的一个线程执行,IO操作在workerGroup中的线程执行 EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new

《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?

房东的猫 提交于 2020-03-15 20:52:16
原文: 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 能坚持别人不能坚持的,才能拥有别人未曾拥有的。 关注 编程大道 公众号,让我们一同坚持心中所想,一起成长!! 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 在这个系列里,我会整理一些面试题与大家分享,帮助年后和我一样想要在金三银四准备跳槽的同学。 我们一起巩固、突击面试官常问的一些面试题,加油!! 1、面试题 Redis和Memcached有什么区别? Redis的线程模型是什么? 为什么Redis是单线程的但是还可以支撑高并发? 2、面试官心理分析 问这个的时候就是问你Redis的原理了,看你是不是思考过,研究过。Redis最基本的一个内部原理和特点,就是Redis实际上是个单线程工作模型。你要是连这个都不知道,那后面在使用Redis的时候,如果出了问题岂不是什么都不知道,无从下手? 还有可能面试官会问问你Redis和Memcached的区别。不过说实话,近几年,面试官都不太喜欢这么问了。因为memcached是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是Redis,没什么公司用memcached了。 3、温馨提醒 如果你要是现在还不知道redis和memcached是啥