[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / platform / core-api / src / com / intellij / openapi / util / SimpleTimer.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.util;
17
18 import com.intellij.util.concurrency.AppExecutorUtil;
19 import org.jetbrains.annotations.NotNull;
20
21 import java.util.concurrent.ScheduledExecutorService;
22 import java.util.concurrent.ScheduledFuture;
23 import java.util.concurrent.TimeUnit;
24
25 /**
26  * Simple timer that keeps order of scheduled tasks
27  */
28 public class SimpleTimer {
29   private static final SimpleTimer ourInstance = newInstance("Shared");
30
31   // restrict threads running tasks to one since same-delay-tasks must be executed sequentially
32   private final ScheduledExecutorService myScheduledExecutorService = AppExecutorUtil.createBoundedScheduledExecutorService(
33     "SimpleTimer Pool", 1);
34   @NotNull private final String myName;
35
36   private SimpleTimer(@NotNull String name) {
37     myName = name;
38   }
39
40   public static SimpleTimer getInstance() {
41     return ourInstance;
42   }
43   
44   public static SimpleTimer newInstance(@NotNull String name) {
45     return new SimpleTimer(name);
46   }
47
48   @NotNull
49   public SimpleTimerTask setUp(@NotNull final Runnable runnable, final long delay) {
50     final ScheduledFuture<?> future = myScheduledExecutorService.schedule(runnable, delay, TimeUnit.MILLISECONDS);
51     return new SimpleTimerTask() {
52       @Override
53       public void cancel() {
54         future.cancel(false);
55       }
56
57       @Override
58       public boolean isCancelled() {
59         return future.isCancelled();
60       }
61     };
62   }
63
64   @Override
65   public String toString() {
66     return "SimpleTimer "+myName;
67   }
68 }