使用线程池的原则
- 根据阿里Java开发手册指导建议直接使用以下代码创建线程池,这样可以做到对线程使用的资源做到心中有数,而不会出现因线程创建过多而产生OOM时的不知所措。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
corePoolSize
:核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime
限制。除非将allowCoreThreadTimeOut
设置为true
。maximumPoolSize
:线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。当任务队列为没有设置大小的LinkedBlockingDeque
时,这个值无效。keepAliveTime
:非核心线程的闲置超时时间,超过这个时间就会被回收。unit
:指定keepAliveTime
的单位,如TimeUnit.SECONDS
。当将allowCoreThreadTimeOut
设置为true
时对corePoolSize
生效。workQueue
:线程池中的任务队列.常用的有三种队列,SynchronousQueue
,LinkedBlockingDeque
,ArrayBlockingQueue
。
可执行定时任务的线程池
包含两种使用方法scheduleWithFixedDelay
和scheduleAtFixedRate
scheduleWithFixedDelay
本次任务执行结束后等待指定延时再执行下次任务,下一次任务受本次计划执行时间的影响。延时计时从本次任务结束开始。
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
- command:he task to execute
- initialDelay:the time to delay first execution
- delay:本次任务结束后延时时间
- unit:延时时间单位
t1 start t1 end/delay start delay end/t2 start
↓ ↓ ↓
|____________|_____________________|__________
try{
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try{
System.out.println(Thread.currentThread().getName()+":task1:"+ DateTime.now().toString("yyyy-MM-dd hh🇲🇲ss"));
Thread.sleep(3000);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}, 0, 3, TimeUnit.SECONDS);
System.in.read();
} catch (IOException e){
e.printStackTrace();
}
- 小结:对于scheduleWithFixedDelay下次任务需等待t1执行时间+delay时间,以上任务每隔6秒执行一次
scheduleAtFixedRate
延时计时从本次任务开始就计时,如果delay
大于任务执行时间则在delay
时间后执行下次任务,如果delay
小于任务执行时间。则在本次任务结束后开始下次人去
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
- command:he task to execute
- initialDelay:the time to delay first execution
- delay:从本次任务开始的延时时间
- unit:延时时间单位
t1 start/delay start delay end t1 end/t2 start/delay start
↓ ↓ ↓
|__________________________|________________|______________________
try{
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try{
System.out.println(Thread.currentThread().getName()+":task2:"+ DateTime.now().toString("yyyy-MM-dd hh🇲🇲ss"));
Thread.sleep(3000);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}, 0, 1, TimeUnit.SECONDS);
System.in.read();
} catch (IOException e){
e.printStackTrace();
}
- 小结:对于
scheduleAtFixedRate
delay
开始时间就是任务其实时间,因此下次任务的开始时间是max{延时时间,任务执行时间}(两个时间取大者),上面代码执行间隔时间是3秒
本文由 zealzhangz 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2018/07/28 15:39