Mercurial Hosting > luan
annotate core/src/luan/modules/ThreadLuan.java @ 715:a82d385ec2c3
add Thread.schedule() and improve Time.period()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 23 May 2016 16:16:03 -0600 |
parents | cdc70de628b5 |
children |
rev | line source |
---|---|
167
4c0131c2b650
merge luan/lib into modules
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
142
diff
changeset
|
1 package luan.modules; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
3 import java.io.Closeable; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
4 import java.util.concurrent.Executor; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 import java.util.concurrent.Executors; |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
6 import java.util.concurrent.ScheduledExecutorService; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
7 import java.util.concurrent.ScheduledFuture; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
8 import java.util.concurrent.TimeUnit; |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
9 import luan.Luan; |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 import luan.LuanState; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 import luan.LuanFunction; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 import luan.LuanTable; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
13 import luan.LuanException; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 import luan.DeepCloner; |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
16 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
17 public final class ThreadLuan { |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
18 private static final Executor exec = Executors.newCachedThreadPool(); |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
19 private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
20 |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
21 public static void fork(LuanState luan,LuanFunction fn,Object... args) { |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
22 DeepCloner cloner = new DeepCloner(); |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
301
diff
changeset
|
23 final LuanState newLuan = (LuanState)cloner.deepClone(luan); |
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
301
diff
changeset
|
24 final LuanFunction newFn = (LuanFunction)cloner.get(fn); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
25 final Object[] newArgs = cloner.deepClone(args); |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
26 exec.execute(new Runnable(){public void run() { |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
27 try { |
574
6cc2f047019b
remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
433
diff
changeset
|
28 newFn.call(newLuan,newArgs); |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
29 } catch(LuanException e) { |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
30 e.printStackTrace(); |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
31 } |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
32 }}); |
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
33 } |
582
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
34 |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
35 public static LuanFunction synchronized_(final LuanState luan,final LuanFunction fn) throws LuanException { |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
582
diff
changeset
|
36 Utils.checkNotNull(fn); |
582
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
37 return new LuanFunction() { |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
38 @Override public Object call(LuanState ingored,Object[] args) throws LuanException { |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
39 synchronized(luan) { |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
40 return fn.call(luan,args); |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
41 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
42 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
43 }; |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
44 } |
31926755689e
add Thread.synchronized
Franklin Schmidt <fschmidt@gmail.com>
parents:
574
diff
changeset
|
45 |
715
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
46 public static void schedule(LuanState luan,long delay,boolean repeat,LuanFunction fn,Object... args) { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
47 DeepCloner cloner = new DeepCloner(); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
48 final LuanState newLuan = (LuanState)cloner.deepClone(luan); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
49 final LuanFunction newFn = (LuanFunction)cloner.get(fn); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
50 final Object[] newArgs = cloner.deepClone(args); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
51 Runnable r = new Runnable(){public void run() { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
52 try { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
53 newFn.call(newLuan,newArgs); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
54 } catch(LuanException e) { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
55 e.printStackTrace(); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
56 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
57 }}; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
58 final ScheduledFuture sf; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
59 if( repeat ) { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
60 sf = scheduler.scheduleWithFixedDelay(r,delay,delay,TimeUnit.MILLISECONDS); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
61 } else { |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
62 sf = scheduler.schedule(r,delay,TimeUnit.MILLISECONDS); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
63 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
64 final Closeable c = new Closeable(){public void close(){ |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
65 boolean b = sf.cancel(false); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
66 }}; |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
67 luan.registry().put(c,c); // prevent gc |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
68 luan.onClose(c); |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
69 } |
a82d385ec2c3
add Thread.schedule() and improve Time.period()
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
70 |
126
0149bdf98fd8
add ThreadLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
71 } |