关于多线程一些比较关键的类(ThreadLocal Lock ReentrantLock Thread ThreadPoolExecute ThreadPoolSchduleExecute Execute ReenTrantReadWriteLock 阻塞队列)
Thread
基本介绍:
基本方法:
构造方法:
Thread()
分配一个新的
Thread 对象。 |
Thread(Runnable target)
分配一个新的
Thread 对象。 |
Thread(Runnable target, String name)
分配一个新的
Thread 对象。 |
Thread(String name)
分配一个新的
Thread 对象。 |
Thread(ThreadGroup group, Runnable target)
分配一个新的
Thread 对象。 |
Thread(ThreadGroup group, Runnable target, String name)
分配一个新的
Thread 对象,使其具有 target 作为其运行对象,具有指定的 name 作为其名称,属于 group 引用的线程组。 |
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
分配一个新的
Thread 对象,以便它具有 target 作为其运行对象,将指定的 name 正如其名,以及属于该线程组由称作 group ,并具有指定的 堆栈大小 。 |
Thread(ThreadGroup group, String name)
分配一个新的
Thread 对象。 |
静态方法:
static int |
MAX_PRIORITY
线程可以拥有的最大优先级。
|
static int |
MIN_PRIORITY
线程可以拥有的最小优先级。
|
static int |
NORM_PRIORITY
分配给线程的默认优先级。
|
|
线程状态。
|
|
当Thread由于未捕获的异常而突然终止时,处理程序的 接口被调用。
|
实例方法:
static int |
activeCount()
返回当前线程的thread group及其子组中活动线程数的估计。
|
void |
checkAccess()
确定当前正在运行的线程是否有权限修改此线程。
|
protected Object |
clone()
将CloneNotSupportedException作为线程抛出无法有意义地克隆。
|
int |
countStackFrames()
已弃用
此呼叫的定义取决于
suspend() ,它已被弃用。 此外,此呼叫的结果从未明确。 |
static Thread |
currentThread()
返回对当前正在执行的线程对象的引用。
|
void |
destroy()
已弃用
这种方法最初是为了销毁这个线程而没有任何清理。 它所持有的任何监视器都将保持锁定。 但是,该方法从未实现。 如果要实施,那么它将是
suspend() 的方式是僵死的 。 如果目标线程在销毁时保护关键系统资源的锁,则无法再次访问该资源。 如果另一个线程曾尝试锁定此资源,将导致死锁。 这种僵局通常表现为“冻结”过程。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
static void |
dumpStack()
将当前线程的堆栈跟踪打印到标准错误流。
|
static int |
enumerate(Thread[] tarray)
将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中。
|
static Map<Thread,StackTraceElement[]> |
getAllStackTraces()
返回所有活动线程的堆栈跟踪图。
|
ClassLoader |
getContextClassLoader()
返回此Thread的上下文ClassLoader。
|
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler()
返回当线程由于未捕获异常突然终止而调用的默认处理程序。
|
long |
getId()
返回此线程的标识符。
|
String |
getName()
返回此线程的名称。
|
int |
getPriority()
返回此线程的优先级。
|
StackTraceElement[] |
getStackTrace()
返回表示此线程的堆栈转储的堆栈跟踪元素数组。
|
Thread.State |
getState()
返回此线程的状态。
|
ThreadGroup |
getThreadGroup()
返回此线程所属的线程组。
|
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler()
返回由于未捕获的异常,此线程突然终止时调用的处理程序。
|
static boolean |
holdsLock(Object obj)
返回 true当且仅当当前线程在指定的对象上保持监视器锁。
|
void |
interrupt()
中断这个线程。
|
static boolean |
interrupted()
测试当前线程是否中断。
|
boolean |
isAlive()
测试这个线程是否活着。
|
boolean |
isDaemon()
测试这个线程是否是守护线程。
|
boolean |
isInterrupted()
测试这个线程是否被中断。
|
void |
join()
等待这个线程死亡。
|
void |
join(long millis)
等待这个线程死亡最多
millis 毫秒。 |
void |
join(long millis, int nanos)
等待最多
millis 毫秒加上 nanos 纳秒这个线程死亡。 |
void |
resume()
已弃用
该方法仅用于与
suspend() 一起使用,因为它是死锁倾向的,因此已被弃用。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
void |
run()
如果这个线程使用单独的
Runnable 运行对象构造,则调用该Runnable 对象的run 方法; 否则,此方法不执行任何操作并返回。 |
void |
setContextClassLoader(ClassLoader cl)
设置此线程的上下文ClassLoader。
|
void |
setDaemon(boolean on)
将此线程标记为 daemon线程或用户线程。
|
static void |
setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获的异常突然终止而调用的默认处理程序,并且没有为该线程定义其他处理程序。
|
void |
setName(String name)
将此线程的名称更改为等于参数
name 。 |
void |
setPriority(int newPriority)
更改此线程的优先级。
|
void |
setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当该线程由于未捕获的异常而突然终止时调用的处理程序。
|
static void |
sleep(long millis)
使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。
|
static void |
sleep(long millis, int nanos)
导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。
|
void |
start()
导致此线程开始执行; Java虚拟机调用此线程的
run 方法。 |
void |
stop()
已弃用
这种方法本质上是不安全的。 使用Thread.stop停止线程可以解锁所有已锁定的监视器(由于未
ThreadDeath ThreadDeath异常在堆栈中ThreadDeath 的自然结果)。 如果先前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象将变得对其他线程可见,可能导致任意行为。 stop 许多用途应该被替换为只是修改一些变量以指示目标线程应该停止运行的代码。 目标线程应该定期检查此变量,如果变量表示要停止运行,则以有序方式从其运行方法返回。 如果目标线程长时间等待(例如,在interrupt 变量上),则应该使用interrupt 方法来中断等待。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
void |
stop(Throwable obj)
已弃用
该方法最初设计为强制线程停止并抛出一个给定的
Throwable 作为例外。 它本质上是不安全的(有关详细信息,请参阅stop() ),此外还可用于生成目标线程未准备处理的异常。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
void |
suspend()
已弃用
这种方法已被弃用,因为它本身就是死锁的。 如果目标线程在挂起时保护关键系统资源的监视器上的锁定,则在目标线程恢复之前,线程不能访问该资源。 如果要恢复目标线程的线程在调用
resume 之前尝试锁定此监视器, resume 导致死锁。 这种僵局通常表现为“冻结”过程。 有关详细信息,请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 。 |
String |
toString()
返回此线程的字符串表示,包括线程的名称,优先级和线程组。
|
static void |
yield()
对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
|
ThreadLocal
基本介绍:
get
或set
方法)都有自己独立初始化的变量副本。 ThreadLocal
实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。基本方法
Modifier and Type | Method and Description |
---|---|
T |
get()
返回当前线程的此线程局部变量的副本中的值。
|
protected T |
initialValue()
返回此线程局部变量的当前线程的“初始值”。
|
void |
remove()
删除此线程局部变量的当前线程的值。
|
void |
set(T value)
将当前线程的此线程局部变量的副本设置为指定的值。
|
static <S> ThreadLocal<S> |
withInitial(Supplier<? extends S> supplier)
创建线程局部变量。
|
Interface Lock(显式锁)
基本介绍
Lock
实现提供比使用synchronized
方法和语句可以获得的更广泛的锁定操作。 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition
。
锁是用于通过多个线程控制对共享资源的访问的工具。 通常,锁提供对共享资源的独占访问:一次只能有一个线程可以获取锁,并且对共享资源的所有访问都要求首先获取锁。 但是,一些锁可能允许并发访问共享资源,如ReadWriteLock
的读锁。
使用synchronized
方法或语句提供对与每个对象相关联的隐式监视器锁的访问,但是强制所有锁获取和释放以块结构的方式发生:当获取多个锁时,它们必须以相反的顺序被释放,并且所有的锁都必须被释放在与它们相同的词汇范围内。
虽然synchronized
方法和语句的范围机制使得使用监视器锁更容易编程,并且有助于避免涉及锁的许多常见编程错误,但是有时您需要以更灵活的方式处理锁。 例如,用于遍历并发访问的数据结构的一些算法需要使用“手动”或“链锁定”:您获取节点A的锁定,然后获取节点B,然后释放A并获取C,然后释放B并获得D等。 所述的实施方式中Lock
接口通过允许获得并在不同的范围释放的锁,并允许获得并以任何顺序释放多个锁使得能够使用这样的技术。
随着这种增加的灵活性,额外的责任。 没有块结构化锁定会删除使用synchronized
方法和语句发生的锁的自动释放。 在大多数情况下,应使用以下惯用语:
Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }
当在不同范围内发生锁定和解锁时,必须注意确保在锁定时执行的所有代码由try-finally或try-catch保护,以确保在必要时释放锁定。
Lock
实现提供了使用synchronized
方法和语句的附加功能,通过提供非阻塞尝试来获取锁( tryLock()
),尝试获取可被中断的锁( lockInterruptibly()
) ,以及尝试获取可以超时( tryLock(long, TimeUnit)
)。
一个Lock
类还可以提供与隐式监视锁定的行为和语义完全不同的行为和语义,例如保证排序,非重入使用或死锁检测。 如果一个实现提供了这样的专门的语义,那么实现必须记录这些语义。
请注意, Lock
实例只是普通对象,它们本身可以用作synchronized
语句中的目标。 获取Lock
实例的监视器锁与调用该实例的任何lock()
方法没有特定关系。 建议为避免混淆,您不要以这种方式使用Lock
实例,除了在自己的实现中。
除非另有说明,传递任何参数的null
值将导致NullPointerException
被抛出。
所有已知实现类:
基本方法:
void |
lock()
获得锁。
|
void |
lockInterruptibly()
获取锁定,除非当前线程是 interrupted 。
|
Condition |
newCondition()
返回一个新
Condition 绑定到该实例Lock 实例。 |
boolean |
tryLock()
只有在调用时才可以获得锁。
|
boolean |
tryLock(long time, TimeUnit unit)
如果在给定的等待时间内是空闲的,并且当前的线程尚未得到 interrupted,则获取该锁。
|
void |
unlock()
释放锁。
|
Class ReentrantLock
基本介绍
Lock
具有与使用synchronized
方法和语句访问的隐式监视锁相同的基本行为和语义,但具有扩展功能。基本方法:
int |
getHoldCount()
查询当前线程对此锁的暂停数量。
|
protected Thread |
getOwner()
返回当前拥有此锁的线程,如果不拥有,则返回
null 。 |
protected Collection<Thread> |
getQueuedThreads()
返回包含可能正在等待获取此锁的线程的集合。
|
int |
getQueueLength()
返回等待获取此锁的线程数的估计。
|
protected Collection<Thread> |
getWaitingThreads(Condition condition)
返回包含可能在与此锁相关联的给定条件下等待的线程的集合。
|
int |
getWaitQueueLength(Condition condition)
返回与此锁相关联的给定条件等待的线程数的估计。
|
boolean |
hasQueuedThread(Thread thread)
查询给定线程是否等待获取此锁。
|
boolean |
hasQueuedThreads()
查询是否有线程正在等待获取此锁。
|
boolean |
hasWaiters(Condition condition)
查询任何线程是否等待与此锁相关联的给定条件。
|
boolean |
isFair()
如果此锁的公平设置为true,则返回
true 。 |
boolean |
isHeldByCurrentThread()
查询此锁是否由当前线程持有。
|
boolean |
isLocked()
查询此锁是否由任何线程持有。
|
void |
lock()
获得锁。(类似synchronized关键字)
|
void |
lockInterruptibly()
获取锁定,除非当前线程是 interrupted 。
|
Condition |
newCondition()
|
String |
toString()
返回一个标识此锁的字符串以及其锁定状态。
|
boolean |
tryLock()
只有在调用时它不被另一个线程占用才能获取锁。
|
boolean |
tryLock(long timeout, TimeUnit unit)
如果在给定的等待时间内没有被另一个线程 占用 ,并且当前线程尚未被 保留,则获取该锁( interrupted) 。
|
void |
unlock()
尝试释放此锁。 (一般在finally语句执行)
|
Interface Condition
基本介绍
Condition
因素出Object
监视器方法( wait
, notify
和notifyAll
)成不同的对象,以得到具有多个等待集的每个对象,通过将它们与使用任意的组合的效果Lock
个实现。 Lock
替换synchronized
方法和语句的使用, Condition
取代了对象监视器方法的使用。
条件(也称为条件队列或条件变量 )为一个线程暂停执行(“等待”)提供了一种方法,直到另一个线程通知某些状态现在可能为真。 因为访问此共享状态信息发生在不同的线程中,所以它必须被保护,因此某种形式的锁与该条件相关联。 等待条件的关键属性是它原子地释放相关的锁并挂起当前线程,就像Object.wait
。
一个Condition
实例本质上绑定到一个锁。 要获得特定Condition
实例的Condition实例,请使用其newCondition()
方法。
基本方法:
void |
await()
导致当前线程等到发信号或 interrupted 。
|
boolean |
await(long time, TimeUnit unit)
使当前线程等待直到发出信号或中断,或指定的等待时间过去。
|
long |
awaitNanos(long nanosTimeout)
使当前线程等待直到发出信号或中断,或指定的等待时间过去。
|
void |
awaitUninterruptibly()
使当前线程等待直到发出信号。
|
boolean |
awaitUntil(Date deadline)
使当前线程等待直到发出信号或中断,或者指定的最后期限过去。
|
void |
signal()
唤醒一个等待线程。
|
void |
signalAll()
唤醒所有等待线程。
|
Interface ReadWriteLock(读写分离锁的抽象)
基本介绍:
基本方法:
Lock |
readLock()
返回用于阅读的锁。
|
Lock |
writeLock()
返回用于写入的锁。
|
Class ReentrantReadWriteLock(读写分离锁)
基本介绍
实现支持类似的语义到
ReentrantLock
。- ReentrantReadWriteLock 读写锁是一种改进的排他锁,也可以称作共享/排他锁.
- 允许多个线程同时读取共享数据,但是一次只允许一个线程对共享数据进行更新.读写锁通过读锁与写锁来完成读写操作.
- 线程在读取共享数据前必须先持有读锁,该读锁可以同时被多个线程持有,即它是共享的.
- 线程在修改共享数据前必须先持有写锁,写锁是排他的, 一个线程持有写锁时其他线程无法获得相应的锁读锁只是在读线程之间共享
- 任何一个线程持有读锁时,其他线程都无法获得写锁, 保证线程在读取数据期间没有其他线程对数据进行更新,使得读线程能够读到数据的最新值,保证在读数据期间共享变量不被修改
读写互斥,读读共享,写写互斥
基本方法:
静态方法:
static class |
ReentrantReadWriteLock.ReadLock
该锁由方法
readLock() 返回。 |
static class |
ReentrantReadWriteLock.WriteLock
该锁由方法
writeLock() 返回。 |
实例方法:
protected Thread |
getOwner()
返回当前拥有写锁的线程,如果不拥有,则返回
null 。 |
protected Collection<Thread> |
getQueuedReaderThreads()
返回一个包含可能正在等待获取读取锁的线程的集合。
|
protected Collection<Thread> |
getQueuedThreads()
返回一个包含可能正在等待获取读取或写入锁定的线程的集合。
|
protected Collection<Thread> |
getQueuedWriterThreads()
返回一个包含可能正在等待获取写入锁的线程的集合。
|
int |
getQueueLength()
返回等待获取读取或写入锁定的线程数的估计。
|
int |
getReadHoldCount()
查询当前线程对此锁的可重入读取保留数。
|
int |
getReadLockCount()
查询为此锁持有的读取锁的数量。
|
protected Collection<Thread> |
getWaitingThreads(Condition condition)
返回包含可能在与写锁相关联的给定条件下等待的线程的集合。
|
int |
getWaitQueueLength(Condition condition)
返回与写入锁相关联的给定条件等待的线程数的估计。
|
int |
getWriteHoldCount()
查询当前线程对此锁的可重入写入数量。
|
boolean |
hasQueuedThread(Thread thread)
查询给定线程是否等待获取读取或写入锁定。
|
boolean |
hasQueuedThreads()
查询是否有任何线程正在等待获取读取或写入锁定。
|
boolean |
hasWaiters(Condition condition)
查询任何线程是否等待与写锁相关联的给定条件。
|
boolean |
isFair()
如果此锁的公平设置为true,则返回
true 。 |
boolean |
isWriteLocked()
查询写锁是否由任何线程持有。
|
boolean |
isWriteLockedByCurrentThread()
查询写锁是否由当前线程持有。
|
ReentrantReadWriteLock.ReadLock |
readLock()
返回用于阅读的锁。
|
String |
toString()
返回一个标识此锁的字符串以及其锁定状态。
|
ReentrantReadWriteLock.WriteLock |
writeLock()
返回用于写入的锁。
|
Interface Executor
基本介绍:
Runnable
任务。 该界面提供了一种将任务提交从每个任务的运行机制分解的方式,包括线程使用,调度等的Executor
。通常使用Executor而不是显式创建线程。基本方法:
void |
execute(Runnable command)
在将来的某个时间执行给定的命令。
|
Class ThreadPoolExecutor(普通任务)
基本介绍:
- 一个
ExecutorService
,使用可能的几个合并的线程执行每个提交的任务,通常使用Executors
工厂方法配置。 - 线程池解决两个不同的问题:由于每个任务的调用开销减少,它们通常在执行大量异步任务时提供改进的性能,并且它们提供了一种限制和管理资源(包括执行一个任务。 每个
ThreadPoolExecutor
还维护一些基本统计信息,例如已完成任务的数量。
基本方法:
构造方法:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
创建一个新的
ThreadPoolExecutor 与给定的初始参数和默认线程工厂和拒绝执行处理程序。 |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
创建一个新的
ThreadPoolExecutor 与给定的初始参数和默认线程工厂。 |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
创建一个新的
ThreadPoolExecutor 与给定的初始参数和默认拒绝执行处理程序。 |
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
创建一个新
ThreadPoolExecutor 给定的初始参数。 |
静态方法:
static class |
ThreadPoolExecutor.AbortPolicy
被拒绝的任务的处理程序,抛出一个
RejectedExecutionException 。 |
static class |
ThreadPoolExecutor.CallerRunsPolicy
一个被拒绝的任务的处理程序,直接在
execute 方法的调用线程中运行被拒绝的任务,除非执行程序已经被关闭,否则这个任务被丢弃。 |
static class |
ThreadPoolExecutor.DiscardOldestPolicy
被拒绝的任务的处理程序,丢弃最旧的未处理请求,然后重试
execute ,除非执行程序关闭,在这种情况下,任务被丢弃。 |
static class |
ThreadPoolExecutor.DiscardPolicy
被拒绝的任务的处理程序静默地丢弃被拒绝的任务。
|
实例方法:
protected void |
afterExecute(Runnable r, Throwable t)
完成指定Runnable的执行后调用方法。
|
void |
allowCoreThreadTimeOut(boolean value)
设置策略是否核心线程可能会超时,如果任务没有在活着的时间内到达,则在新任务到达时被替换。
|
boolean |
allowsCoreThreadTimeOut()
如果此池允许核心线程超时并终止,如果没有任务在keepAlive时间内到达,则返回true,如果新任务到达时需要更换。
|
boolean |
awaitTermination(long timeout, TimeUnit unit)
阻止所有任务在关闭请求完成后执行,或发生超时,或当前线程中断,以先到者为准。
|
protected void |
beforeExecute(Thread t, Runnable r)
在给定的线程中执行给定的Runnable之前调用方法。
|
void |
execute(Runnable command)
在将来某个时候执行给定的任务。
|
protected void |
finalize()
当这个执行器不再被引用并且没有线程时,调用
shutdown 。 |
int |
getActiveCount()
返回正在执行任务的线程的大概数量。
|
long |
getCompletedTaskCount()
返回完成执行的任务的大致总数。
|
int |
getCorePoolSize()
返回核心线程数。
|
long |
getKeepAliveTime(TimeUnit unit)
返回线程保持活动时间,这是超过核心池大小的线程在终止之前可能保持空闲的时间量。
|
int |
getLargestPoolSize()
返回在池中同时进行的最大线程数。
|
int |
getMaximumPoolSize()
返回允许的最大线程数。
|
int |
getPoolSize()
返回池中当前的线程数。
|
BlockingQueue<Runnable> |
getQueue()
返回此执行程序使用的任务队列。
|
RejectedExecutionHandler |
getRejectedExecutionHandler()
返回不可执行任务的当前处理程序。
|
long |
getTaskCount()
返回计划执行的任务的大概总数。
|
ThreadFactory |
getThreadFactory()
返回用于创建新线程的线程工厂。
|
boolean |
isShutdown()
如果此执行者已关闭,则返回
true 。 |
boolean |
isTerminated()
如果所有任务在关闭后完成,则返回
true 。 |
boolean |
isTerminating()
如果此执行者在
shutdown() 或 shutdownNow() 之后 终止 ,但尚未完全终止,则返回true。 |
int |
prestartAllCoreThreads()
启动所有核心线程,导致他们等待工作。
|
boolean |
prestartCoreThread()
启动核心线程,使其无法等待工作。
|
void |
purge()
尝试从工作队列中删除已取消的所有
Future 任务。 |
boolean |
remove(Runnable task)
如果此任务存在,则从执行程序的内部队列中删除此任务,从而导致该任务尚未运行。
|
void |
setCorePoolSize(int corePoolSize)
设置核心线程数。
|
void |
setKeepAliveTime(long time, TimeUnit unit)
设置线程在终止之前可能保持空闲的时间限制。
|
void |
setMaximumPoolSize(int maximumPoolSize)
设置允许的最大线程数。
|
void |
setRejectedExecutionHandler(RejectedExecutionHandler handler)
为不可执行的任务设置一个新的处理程序。
|
void |
setThreadFactory(ThreadFactory threadFactory)
设置用于创建新线程的线程工厂。
|
void |
shutdown()
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
|
List<Runnable> |
shutdownNow()
尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。
|
protected void |
terminated()
执行程序已终止时调用方法。
|
String |
toString()
返回标识此池的字符串及其状态,包括运行状态和估计的工作人员和任务计数的指示。
|
Class ScheduledThreadPoolExecutor(专门做定时任务)
基本介绍:
ThreadPoolExecutor
可另外调度在给定延迟之后运行的命令,或定期执行。 该类优选的是Timer
需要多个工作线程时,或当附加灵活性或能力ThreadPoolExecutor
需要(这此类扩展)。
延迟任务执行时间早于启用,但没有任何实时保证,在启用后,他们将开始。 计划执行完全相同执行时间的任务将以先进先出(FIFO)的提交顺序启用。
提交的任务在运行之前被取消,执行被抑制。 默认情况下,这样一个取消的任务在工作队列中不会自动删除,直到其延迟过去。 虽然这样可以进一步检查和监控,但也可能导致取消任务的无限制保留。 为避免这种情况,请将setRemoveOnCancelPolicy(boolean)
设置为true
,这将导致任务在取消时立即从工作队列中删除。
通过scheduleAtFixedRate
或scheduleWithFixedDelay
的任务的scheduleWithFixedDelay
执行不重叠。 虽然不同的执行可以通过不同的线程来执行,先前执行的效果happen-before那些随后的那些的。
虽然这个类继承自ThreadPoolExecutor
,但是一些继承的调优方法对它没有用。 特别是因为它作为使用corePoolSize
线程和无限队列的固定大小的池,对maximumPoolSize
没有任何有用的效果。 此外,将corePoolSize
设置为零或使用allowCoreThreadTimeOut
几乎不是一个好主意,因为这可能会使池没有线程来处理任务,只要它们有资格运行。
此类覆盖execute
和submit
方法以生成内部ScheduledFuture
对象来控制每个任务的延迟和调度。 为了保护功能,子类中这些方法的任何进一步覆盖都必须调用超类版本,这有效地禁用其他任务自定义。 然而,此类提供替代保护扩展方法decorateTask
(每一个用于一个版本Runnable
和Callable
),其可以被用于定制用于执行经由输入的命令的具体任务类型execute
, submit
, schedule
, scheduleAtFixedRate
和scheduleWithFixedDelay
。 默认情况下, ScheduledThreadPoolExecutor
使用扩展为FutureTask
的任务类型。 但是,可以使用以下形式的子类修改或替换:
基本方法:
构造方法:
ScheduledThreadPoolExecutor(int corePoolSize)
创建一个新的
ScheduledThreadPoolExecutor 与给定的核心池大小。 |
ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler)
使用给定的初始参数创建一个新的ScheduledThreadPoolExecutor。
|
ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory)
创建一个新的
ScheduledThreadPoolExecutor 与给定的初始参数。 |
ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler)
使用给定的初始参数创建一个新的ScheduledThreadPoolExecutor。
|
实例方法:
protected <V> RunnableScheduledFuture<V> |
decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task)
修改或替换用于执行可调用的任务。
|
protected <V> RunnableScheduledFuture<V> |
decorateTask(Runnable runnable, RunnableScheduledFuture<V> task)
修改或替换用于执行runnable的任务。
|
void |
execute(Runnable command)
执行
command 零要求延迟。 |
boolean |
getContinueExistingPeriodicTasksAfterShutdownPolicy()
获得关于是否继续执行现有定期任务的策略,即使该执行者已经是
shutdown 。 |
boolean |
getExecuteExistingDelayedTasksAfterShutdownPolicy()
获得有关是否执行现有延迟任务的政策,即使这个执行者已经是
shutdown 。 |
BlockingQueue<Runnable> |
getQueue()
返回此执行程序使用的任务队列。
|
boolean |
getRemoveOnCancelPolicy()
获取关于在取消时是否应立即将已取消任务从工作队列中删除的策略。
|
<V> ScheduledFuture<V> |
schedule(Callable<V> callable, long delay, TimeUnit unit)
创建并执行在给定延迟后启用的ScheduledFuture。
|
ScheduledFuture<?> |
schedule(Runnable command, long delay, TimeUnit unit)
创建并执行在给定延迟后启用的单次操作。
|
ScheduledFuture<?> |
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
创建并执行在给定的初始延迟之后,随后以给定的时间段首先启用的周期性动作; 那就是执行将在
initialDelay 之后开始,然后initialDelay+period ,然后是initialDelay + 2 * period 等等。 |
ScheduledFuture<?> |
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
创建并执行在给定的初始延迟之后首先启用的定期动作,随后在一个执行的终止和下一个执行的开始之间给定的延迟。
|
void |
setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value)
设置关于是否继续执行现有周期性任务的策略,即使该执行者已经是
shutdown 。 |
void |
setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value)
设置关于是否执行现有延迟任务的策略,即使该执行者已经是
shutdown 。 |
void |
setRemoveOnCancelPolicy(boolean value)
设置取消时取消任务是否应立即从工作队列中删除的策略。
|
void |
shutdown()
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
|
List<Runnable> |
shutdownNow()
尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。
|
<T> Future<T> |
submit(Callable<T> task)
提交值返回任务以执行,并返回代表任务待处理结果的Future。
|
Future<?> |
submit(Runnable task)
提交一个可运行的任务执行,并返回一个表示该任务的未来。
|
<T> Future<T> |
submit(Runnable task, T result)
提交一个可运行的任务执行,并返回一个表示该任务的未来。
|
阻塞队列
JDK7 提供了 7 个阻塞队列。分别是
- ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
- LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
- DelayQueue:一个使用优先级队列实现的无界阻塞队列。
- SynchronousQueue:一个不存储元素的阻塞队列。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列
具体方法参照Collection接口的各个实现类
Interface Callable<V>
基本介绍:
call
。
Callable
接口类似于Runnable
,因为它们都是为其实例可能由另一个线程执行的类设计的。 然而,A Runnable
不返回结果,也不能抛出被检查的异常。
基本方法:
V |
call()
计算一个结果,如果不能这样做,就会抛出一个异常。
|
FutureTask包装器可以将Callable转换成Future和Runable(Future同时实现了两者的接口)
Interface Future<V>
基本介绍:
Future
计算的结果。 提供方法来检查计算是否完成,等待其完成,并检索计算结果。 结果只能在计算完成后使用方法get
进行检索,如有必要,阻塞,直到准备就绪。 取消由cancel
方法执行。 提供其他方法来确定任务是否正常完成或被取消。 计算完成后,不能取消计算。 如果您想使用Future
,以便不可撤销,但不提供可用的结果,则可以声明Future<?>
表格的类型,并返回null
作为基础任务的结果。基本方法:
boolean |
cancel(boolean mayInterruptIfRunning)
尝试取消执行此任务。
|
V |
get()
等待计算完成,然后检索其结果。
|
V |
get(long timeout, TimeUnit unit)
如果需要等待最多在给定的时间计算完成,然后检索其结果(如果可用)。
|
boolean |
isCancelled()
如果此任务在正常完成之前被取消,则返回
true 。 |
boolean |
isDone()
返回
true 如果任务已完成。 |
代码示例:
1 package com.edu.future_callable; 2 3 import java.util.concurrent.Callable; 4 import java.util.concurrent.Future; 5 import java.util.concurrent.FutureTask; 6 import java.util.concurrent.TimeUnit; 7 8 /** 9 * @作者 five-five 10 * @创建时间 2020/10/7 11 */ 12 public class FutureTest{ 13 public static void main(String[] args){ 14 //这里用的是Callable 15 FutureTask<Integer> futureTask = new FutureTask<Integer>(()->{ 16 TimeUnit.SECONDS.sleep(2); 17 Integer res=Integer.valueOf((int) (Math.random()*1000)); 18 System.out.println(Math.random()*1000+String.class.hashCode()); 19 return res; 20 }); 21 System.out.println("搞完了?=="+futureTask.isDone()); 22 futureTask.run(); 23 System.out.println("搞完了?=="+futureTask.isDone()); 24 System.out.println("结束了?=="+futureTask.isCancelled()); 25 26 System.out.println("========================================================="); 27 //这个是Runnable 28 Runnable r=new Runnable(){ 29 @Override 30 public void run() { 31 try { 32 TimeUnit.SECONDS.sleep(2); 33 } catch (InterruptedException e) { 34 e.printStackTrace(); 35 } 36 Integer res=Integer.valueOf((int) (Math.random()*1000)); 37 System.out.println(Math.random()*1000+String.class.hashCode()); 38 } 39 }; 40 Integer num = null; 41 FutureTask<Integer> futureTask1 = new FutureTask<Integer>(r,num); 42 System.out.println("搞完了?=="+futureTask1.isDone()); 43 futureTask1.run(); 44 System.out.println("搞完了?=="+futureTask1.isDone()); 45 System.out.println("结束了?=="+futureTask1.isCancelled()); 46 47 } 48 }