| author | wenzelm | 
| Thu, 17 Mar 2016 12:32:12 +0100 | |
| changeset 62660 | 285308563814 | 
| parent 62263 | 2c76c66897fc | 
| child 63805 | c272680df665 | 
| permissions | -rw-r--r-- | 
| 61556 | 1  | 
/* Title: Pure/Concurrent/standard_thread.scala  | 
| 
45673
 
cd41e3903fbf
separate compilation of PIDE vs. Pure sources, which enables independent Scala library;
 
wenzelm 
parents: 
45667 
diff
changeset
 | 
2  | 
Module: PIDE  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
Author: Makarius  | 
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
|
| 61556 | 5  | 
Standard thread operations.  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
*/  | 
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
|
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
package isabelle  | 
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
|
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
10  | 
|
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
11  | 
import java.lang.Thread  | 
| 
62056
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
12  | 
import java.util.concurrent.{ThreadPoolExecutor, TimeUnit, LinkedBlockingQueue, ThreadFactory}
 | 
| 61563 | 13  | 
|
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
14  | 
|
| 61556 | 15  | 
object Standard_Thread  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
16  | 
{
 | 
| 61563 | 17  | 
/* fork */  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
18  | 
|
| 39577 | 19  | 
def fork(name: String = "", daemon: Boolean = false)(body: => Unit): Thread =  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
20  | 
  {
 | 
| 39577 | 21  | 
val thread =  | 
22  | 
      if (name == null || name == "") new Thread() { override def run = body }
 | 
|
23  | 
      else new Thread(name) { override def run = body }
 | 
|
| 38638 | 24  | 
thread.setDaemon(daemon)  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
25  | 
thread.start  | 
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
thread  | 
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
}  | 
| 
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
28  | 
|
| 39579 | 29  | 
|
| 61563 | 30  | 
/* pool */  | 
| 
56730
 
e723f041b6d0
tuned signature -- separate pool for JFuture tasks, which can be canceled;
 
wenzelm 
parents: 
56707 
diff
changeset
 | 
31  | 
|
| 
61559
 
313eca3fa847
more direct task future implementation, with proper cancel operation;
 
wenzelm 
parents: 
61556 
diff
changeset
 | 
32  | 
lazy val pool: ThreadPoolExecutor =  | 
| 
59136
 
c2b23cb8a677
added Par_List in Scala, in accordance to ML version;
 
wenzelm 
parents: 
56860 
diff
changeset
 | 
33  | 
    {
 | 
| 
 
c2b23cb8a677
added Par_List in Scala, in accordance to ML version;
 
wenzelm 
parents: 
56860 
diff
changeset
 | 
34  | 
      val m = Properties.Value.Int.unapply(System.getProperty("isabelle.threads", "0")) getOrElse 0
 | 
| 
 
c2b23cb8a677
added Par_List in Scala, in accordance to ML version;
 
wenzelm 
parents: 
56860 
diff
changeset
 | 
35  | 
val n = if (m > 0) m else (Runtime.getRuntime.availableProcessors max 1) min 8  | 
| 
62056
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
36  | 
val executor =  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
37  | 
new ThreadPoolExecutor(n, n, 2500L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue[Runnable])  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
38  | 
val old_thread_factory = executor.getThreadFactory  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
39  | 
executor.setThreadFactory(  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
40  | 
        new ThreadFactory {
 | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
41  | 
def newThread(r: Runnable) =  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
42  | 
          {
 | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
43  | 
val thread = old_thread_factory.newThread(r)  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
44  | 
thread.setDaemon(true)  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
45  | 
thread  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
46  | 
}  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
47  | 
})  | 
| 
 
6dbeafce6318
ensure that thread pool creates daemon threads, to increase chances that the JVM terminates spontaneously;
 
wenzelm 
parents: 
61563 
diff
changeset
 | 
48  | 
executor  | 
| 
59136
 
c2b23cb8a677
added Par_List in Scala, in accordance to ML version;
 
wenzelm 
parents: 
56860 
diff
changeset
 | 
49  | 
}  | 
| 
56730
 
e723f041b6d0
tuned signature -- separate pool for JFuture tasks, which can be canceled;
 
wenzelm 
parents: 
56707 
diff
changeset
 | 
50  | 
|
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
51  | 
|
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
52  | 
/* delayed events */  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
53  | 
|
| 62263 | 54  | 
final class Delay private [Standard_Thread](first: Boolean, delay: => Time, event: => Unit)  | 
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
55  | 
  {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
56  | 
private var running: Option[Event_Timer.Request] = None  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
57  | 
|
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
58  | 
private def run: Unit =  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
59  | 
    {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
60  | 
      val do_run = synchronized {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
61  | 
        if (running.isDefined) { running = None; true } else false
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
62  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
63  | 
if (do_run) event  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
64  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
65  | 
|
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
66  | 
def invoke(): Unit = synchronized  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
67  | 
    {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
68  | 
val new_run =  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
69  | 
        running match {
 | 
| 62263 | 70  | 
          case Some(request) => if (first) false else { request.cancel; true }
 | 
71  | 
case None => true  | 
|
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
72  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
73  | 
if (new_run)  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
74  | 
running = Some(Event_Timer.request(Time.now() + delay)(run))  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
75  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
76  | 
|
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
77  | 
def revoke(): Unit = synchronized  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
78  | 
    {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
79  | 
      running match {
 | 
| 62263 | 80  | 
case Some(request) => request.cancel; running = None  | 
81  | 
case None =>  | 
|
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
82  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
83  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
84  | 
|
| 61194 | 85  | 
def postpone(alt_delay: Time): Unit = synchronized  | 
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
86  | 
    {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
87  | 
      running match {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
88  | 
case Some(request) =>  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
89  | 
val alt_time = Time.now() + alt_delay  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
90  | 
          if (request.time < alt_time && request.cancel) {
 | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
91  | 
running = Some(Event_Timer.request(alt_time)(run))  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
92  | 
}  | 
| 62263 | 93  | 
case None =>  | 
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
94  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
95  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
96  | 
}  | 
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
97  | 
|
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
98  | 
// delayed event after first invocation  | 
| 62263 | 99  | 
def delay_first(delay: => Time)(event: => Unit): Delay = new Delay(true, delay, event)  | 
| 
56770
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
100  | 
|
| 
 
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
 
wenzelm 
parents: 
56730 
diff
changeset
 | 
101  | 
// delayed event after last invocation  | 
| 62263 | 102  | 
def delay_last(delay: => Time)(event: => Unit): Delay = new Delay(false, delay, event)  | 
| 
38636
 
b7647ca7de5a
module for simplified thread operations (Scala version);
 
wenzelm 
parents:  
diff
changeset
 | 
103  | 
}  |