Java多线程之ScheduledExecutorService
2013-10-15 01:13
417 查看
package com.mutilthread.executor.battery; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; /** * 例子:电池充电 * 1. 类不可变性(一个精心构造的对象能够保证在其没能恢复到有效状态时,它本身的任何方法都不能够被访问。) * 2. 多用线程池,不要随意开启线程 * 3. 对可变字段的修改要对多线程访问可见 * 4. 确定锁的粒度 * 5. 确保多个字段变量访问是原子的 * @author yQuery * */ public class RefreshBattery { private final long MAXLEVEL = 100; private AtomicLong level = new AtomicLong(MAXLEVEL); private final static ScheduledExecutorService service = Executors.newScheduledThreadPool(1, new java.util.concurrent.ThreadFactory(){ @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setDaemon(true); return thread; } }); private ScheduledFuture<?> refresh; private RefreshBattery() { } private void init() { refresh = service.scheduleAtFixedRate(new Runnable(){ @Override public void run() { refresh(); } }, 0, 1, TimeUnit.SECONDS); } public static RefreshBattery getInstance() { RefreshBattery rb = new RefreshBattery(); rb.init(); return rb; } private void refresh() { if(level.get() < MAXLEVEL){ level.incrementAndGet(); System.out.println("charging..."); // 充电中... } else { refresh.cancel(true); System.out.println("finished");// 充电完成. } } public boolean useEnergy(final long units) { boolean available = false; final long currentLevel = level.get(); if(units >= 0 && units <= currentLevel) { level.compareAndSet(currentLevel, currentLevel-units); available = true; System.out.println("useEnergy: "+units); } return available; } public static void main(String[] args) throws InterruptedException { RefreshBattery rb = getInstance(); rb.useEnergy(5); TimeUnit.SECONDS.sleep(10); } /** * Output: * useEnergy: 5 charging... charging... charging... charging... charging... finished */ }
相关文章推荐
- 【Java多线程】-Timer,TimerTask,ScheduledExecutorService
- Java多线程--ScheduledExecutorService的使用
- java中的多线程包--- Timer的缺陷 用ScheduledExecutorService替代
- java多线程编程获取线程返回值:ExecutorCompletionService
- Java并发之定时任务接口ScheduledExecutorService
- java多线程:ExecutorService多线程实例(六)
- 【Java并发】- ScheduledThreadPoolExecutor, ScheduledExecutorService使用
- java定时任务接口ScheduledExecutorService
- java定时任务接口ScheduledExecutorService
- Java中 Timer缺陷,用ScheduledExecutorService替代
- Java多线程之ExecutorService
- Java学习:Timer与ScheduledExecutorService的区别
- Java ScheduledExecutorService教程
- Java并发编程:ScheduledExecutorService执行周期任务
- java并发:Timer的缺陷 用ScheduledExecutorService替代 .
- Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代
- 任务调度(四)——ScheduledExecutorService替代Timer,实现多线程任务调度
- java定时任务接口ScheduledExecutorService
- Java并发之ScheduledExecutorService(schedule、scheduleAtFixedRate、scheduleWithFixedDelay)
- java多线程核心接口 — ExecutorService 的理解与使用