http://blog.csdn.net/gaojava/article/details/8608348
- public class SchedulerService extends Service {
- private static final int DEFAULT_POOL_SIZE = 2 * Runtime.getRuntime().availableProcessors();
- private int poolSize;
- private ScheduledExecutorService pool;
- public int getPoolSize() {
- return poolSize;
- }
- public void setPoolSize(int poolSize) {
- if (poolSize < 0) {
- logger.warning("pool size error,use default value:" + DEFAULT_POOL_SIZE);
- poolSize = DEFAULT_POOL_SIZE;
- }
- this.poolSize = poolSize;
- }
- protected void initService() throws ServiceException {
- pool = Executors.newScheduledThreadPool(poolSize);
- }
- protected void startService() throws ServiceException {
- //
- }
- protected void stopService() throws ServiceException {
- pool.shutdown();
- try {
- if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
- pool.shutdownNow();
- if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
- logger.severe("Pool did not terminate");
- }
- }
- } catch (InterruptedException e) {
- pool.shutdownNow();
- Thread.currentThread().interrupt();
- }
- }
- ScheduledExecutorService getPool() {
- return pool;
- }
- public Scheduler scheduleWithFixedDelay(Runnable task, long delay, long period, TimeUnit util) {
- Scheduler scheduler = new Scheduler();
- scheduler.setDelay(delay);
- scheduler.setPeriod(period);
- scheduler.setWorker(task);
- scheduler.setService(this);
- return scheduler;
- }
- public Scheduler schedule(Runnable task, long delay, TimeUnit util) {
- Scheduler scheduler = new Scheduler();
- scheduler.setDelay(delay);
- scheduler.setPeriod(-1);
- scheduler.setWorker(task);
- scheduler.setService(this);
- return scheduler;
- }
- }
- public class Scheduler {
- private SchedulerService service;
- private Runnable worker;
- private long period = -1;
- private long delay = 0;
- private ScheduledFuture<?> task;
- void setService(SchedulerService service) {
- this.service = service;
- }
- void setWorker(Runnable worker) {
- this.worker = worker;
- }
- void setPeriod(long period) {
- this.period = period;
- }
- void setDelay(long delay) {
- this.delay = delay;
- }
- public SchedulerService getService() {
- return service;
- }
- public Runnable getWorker() {
- return worker;
- }
- public ScheduledFuture<?> getTask() {
- return task;
- }
- public void cancel() {
- if (this.task != null
- && (!this.task.isCancelled() || !this.task.isDone())) {
- this.task.cancel(true);
- }
- }
- public long getDelay() {
- return delay;
- }
- public long getPeriod() {
- return period;
- }
- public boolean isRunning() {
- return task != null && !task.isCancelled() && !task.isDone();
- }
- public synchronized void start() {
- if (!isRunning()) {
- if (service != null && worker != null) {
- if (this.period > 0) {
- task = service.getPool().scheduleWithFixedDelay(worker,
- this.delay, this.period, TimeUnit.MILLISECONDS);
- } else {
- task = service.getPool().schedule(worker, this.delay,
- TimeUnit.MILLISECONDS);
- }
- }
- }
- }
- }
- private Scheduler addSchedulerJob(final ITimeTask task,long delay ,final IPluginActivator activator) {
- Scheduler timer = schedulerService.scheduleWithFixedDelay(new Runnable() {
- public void run() {
- try {
- if (activator.getState() == IPluginActivator.RUNNING) {
- task.excute();
- }
- } catch (Throwable e) {
- logger.log(Level.SEVERE, "", e);
- }
- }
- }, 0, delay, TimeUnit.MILLISECONDS);
- return timer;
- }