Mercurial Hosting > luan
diff src/luan/modules/ThreadLuan.java @ 775:1a68fc55a80c
simplify dir structure
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 26 Aug 2016 14:36:40 -0600 |
parents | core/src/luan/modules/ThreadLuan.java@a82d385ec2c3 |
children | fbbdd369a13a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/ThreadLuan.java Fri Aug 26 14:36:40 2016 -0600 @@ -0,0 +1,71 @@ +package luan.modules; + +import java.io.Closeable; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import luan.Luan; +import luan.LuanState; +import luan.LuanFunction; +import luan.LuanTable; +import luan.LuanException; +import luan.DeepCloner; + + +public final class ThreadLuan { + private static final Executor exec = Executors.newCachedThreadPool(); + private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + + public static void fork(LuanState luan,LuanFunction fn,Object... args) { + DeepCloner cloner = new DeepCloner(); + final LuanState newLuan = (LuanState)cloner.deepClone(luan); + final LuanFunction newFn = (LuanFunction)cloner.get(fn); + final Object[] newArgs = cloner.deepClone(args); + exec.execute(new Runnable(){public void run() { + try { + newFn.call(newLuan,newArgs); + } catch(LuanException e) { + e.printStackTrace(); + } + }}); + } + + public static LuanFunction synchronized_(final LuanState luan,final LuanFunction fn) throws LuanException { + Utils.checkNotNull(fn); + return new LuanFunction() { + @Override public Object call(LuanState ingored,Object[] args) throws LuanException { + synchronized(luan) { + return fn.call(luan,args); + } + } + }; + } + + public static void schedule(LuanState luan,long delay,boolean repeat,LuanFunction fn,Object... args) { + DeepCloner cloner = new DeepCloner(); + final LuanState newLuan = (LuanState)cloner.deepClone(luan); + final LuanFunction newFn = (LuanFunction)cloner.get(fn); + final Object[] newArgs = cloner.deepClone(args); + Runnable r = new Runnable(){public void run() { + try { + newFn.call(newLuan,newArgs); + } catch(LuanException e) { + e.printStackTrace(); + } + }}; + final ScheduledFuture sf; + if( repeat ) { + sf = scheduler.scheduleWithFixedDelay(r,delay,delay,TimeUnit.MILLISECONDS); + } else { + sf = scheduler.schedule(r,delay,TimeUnit.MILLISECONDS); + } + final Closeable c = new Closeable(){public void close(){ + boolean b = sf.cancel(false); + }}; + luan.registry().put(c,c); // prevent gc + luan.onClose(c); + } + +}