线程状态
new新生,runnable可运行,blocked堵塞,dead死亡
线程堵塞的原因和恢复方式:
线程睡眠-睡眠结束,经过指定的毫秒数
i/o堵塞-i/o操作完成,
等待锁定-锁可用,等待的锁被其它线程释放或者等待超时
等待-通知,等待某个触发条件,当另外一个线程发出信号量表明条件已经发生变化。则回唤醒该线程进入可运行状态,重新判断等待条件
线程死亡的原因:
1 run方法正常退出导致正常死亡
2 未捕获的异常导致run方法意外终止而猝死
java.util.concurrent.locks包
Lock 是一个接口
ReentrantLock 可用来保护临界区的可重用锁
ReentrantLock rlock = new ReentrantLock ();
rlock.lock();
try{
//dosth
}finally{
rlock.unlock();
}
ReentrantLock是排他锁,如果等待的条件没有被满足,就会持续等待,其它线程也会堵塞
ReentrantLock rlock = new ReentrantLock ();
rlock.lock();
try{
while(//线程堵塞的判断条件){
//wait
}
// dobusiness
}finally{
rlock.unlock();
}
ReentrantLock rlock = new ReentrantLock ();
Condition sufficientCondition = rlock.newCondition();
rlock.lock();
try{
while(true/*线程堵塞的判断条件*/){
//当前线程堵塞了,并且放弃了锁,可以使其它的线程获得锁
sufficientCondition.await();
}
// dobusiness
//其它的线程获得锁后,调用sufficientCondition的signalAll()方法,解除所有等待该条件的堵塞线程
//它们将尝试再次获得锁,但是只有其中的一个可以获得锁,并在堵塞的地方再次执行
//因此我们此处必须再次测试等待条件,
//如果调用signal方法很危险,因为唤醒的线程如果堵塞而没有调用signal方法就很容易使所有的线程
//等待下去,出现死锁
sufficientCondition.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
rlock.unlock();
}
object的notify ()和notifyall()和wait()方法必须在持有当前锁的情况下才能使用否则会抛出
illegalmonitorstateexception异常
可以使用堵塞队列来实现
读写锁
使只读线程彼此之间不会堵塞
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
//运行只读线程可以共享访问
Lock readLock = rwl.readLock();
Lock writeLock = rwl.writeLock();
堵塞队列
java.util.concurrent.ArrayBlockingQueue<E> 循环数组实现
java.util.concurrent.LinkedBlockingQueue<E> 链表实现
java.util.concurrent.DelayQueue<E extends Delayed> 有限堵塞时间的堵塞队列
java.util.concurrent.PriorityBlockingQueue<E> 堆实现
线程安全的集合
高效队列和散列表
ConcurrentLinkedQueue和ConcurrentHashMap
可以稳定支持16个写入进程
ConcurrentLinkedQueue<E>
可以被多个线程安全访问的无边界的非堵塞队列
ConcurrentHashMap<K,V>
可以被多个线程安全访问的散列映射表
创建一个新线程的代价是很高的,因此使用线程池可以缓存一定数量的线程.
当线程的run方法退出时,线程不会死亡,而是在池中继续准备下一个请求提供服务.
但是线程池的应用并不是为了节省创建新线程的资源而是为了限制应用的线程数目.
首先没有必要为每个请求都创建线程,而且大量的线程会降低性能并且使虚拟机崩溃.
分享到:
相关推荐
本文将详细介绍线程池原理、使用场景及注意事项,以及阻塞队列的相关知识。 首先,线程池是一种基于池化思想管理线程的技术,它可以重用一组线程执行多个任务。线程池的工作原理是通过维护一定数量的工作线程,这些...
鱼刺模块线程池可能提供了更高级的特性,例如线程优先级、任务队列的管理策略、线程超时控制等,以适应不同场景的需求。 对比精易模块线程池和鱼刺模块线程池,我们可以关注以下几个方面: 1. 性能:比较两者在线程...
在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...
本文主要讲解了Java中的阻塞队列、线程池以及File类的相关知识,并涉及到了递归的概念。阻塞队列是并发编程中的一种重要工具,它在多线程环境下的生产者-消费者模型中起到关键作用。线程池则是为了优化线程管理,...
线程池和队列在IT领域中是两个非常重要的概念,尤其在多线程编程和并发处理中扮演着核心角色。它们各自有独特的特性和适用场景,理解它们的区别和使用场景对于优化系统性能至关重要。 首先,让我们从线程池开始。...
阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...
非阻塞线程池框架是一种高效的任务执行机制,它的核心理念是通过避免线程之间的等待,从而提升系统整体的并发性能。在传统的阻塞线程池中,如果一个任务正在执行,其他线程必须等待其完成才能获取CPU资源,这在高...
在Android中,线程池和任务队列的使用通常与异步处理、UI更新、后台服务等场景紧密相关。例如,我们可以通过`AsyncTask`配合线程池来处理耗时操作,避免阻塞主线程。`AsyncTask`内部就使用了线程池来管理后台任务,...
线程池的工作原理是:当任务被提交到线程池时,线程池会根据当前系统负载和已有的线程数量,决定是否立即创建新线程执行任务,或者将任务放入队列等待。线程池会维护一个最小和最大线程数,以保持性能与资源消耗的...
### glib库异步队列和线程池代码分析 ...总结来说,glib库提供的异步队列和线程池机制为开发多线程应用程序提供了一种高效的方法,通过合理的管理和调度,可以显著提高系统的并发性能和响应速度。
首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞,直到有消费者取走元素;当队列空时,消费者线程会被阻塞,直到生产者放入新的元素。常用实现如`...
- **线程池大小设置**:应根据系统资源和任务特性合理设置,过大可能导致资源浪费,过小可能造成阻塞。 - **拒绝策略选择**:根据业务需求选择合适的策略,防止系统崩溃或丢失数据。 - **监控与调整**:实时监控...
综上所述,这个项目涉及了C#多线程编程的核心概念和技术,包括工作队列的实现、线程池的使用、异步编程以及线程安全的编程实践。通过深入理解这些知识点,开发者可以构建高效、可扩展且健壮的多线程应用程序。
线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、大数据量和分布式系统中具有广泛应用。 线程池是一种线程使用模式,它预先创建了一组可重用的线程,当有任务需要执行时,不再直接...
通过以上分析可以看出,Java多线程加队列上传文件的实现不仅涉及基础的网络编程和文件操作知识,还需要掌握高级的多线程管理和并发控制技术。这种技术方案适用于需要高效处理大量文件上传请求的场景,比如云存储服务...
线程、多线程和线程池面试专题 一、线程的概念和创建方式 1. 线程的概念:线程是操作系统能够进行运算调度的最小单位,它是进程中的一个执行流程。 2. 创建线程的方式:有三种方式创建线程,即继承Thread类、实现...
在这个实现中,线程池可能会有一个同步机制,如互斥锁(mutex)或信号量(semaphore),来保证对线程池和任务队列的操作是线程安全的。此外,可能存在一种策略来决定何时启动新线程,何时回收空闲线程,以及如何平衡...
总的来说,这个资源包将帮助开发者深入理解多线程编程中的锁机制和线程池实现,虽然没有涵盖IOCP,但对理解和掌握多线程编程的基本原理和实践技巧仍然非常有价值。通过分析和学习这些源码,开发者能够更好地设计和...