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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }