Mercurial Hosting > luan
changeset 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 | 7a322e942c15 |
children | 28fedb32ab19 |
files | core/src/luan/modules/Thread.luan core/src/luan/modules/ThreadLuan.java core/src/luan/modules/Time.luan |
diffstat | 3 files changed, 35 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/core/src/luan/modules/Thread.luan Fri May 20 18:35:20 2016 -0600 +++ b/core/src/luan/modules/Thread.luan Mon May 23 16:16:03 2016 -0600 @@ -4,6 +4,7 @@ local M = {} M.fork = ThreadLuan.fork +M.schedule = ThreadLuan.schedule M.synchronized = ThreadLuan.synchronized_ return M
--- a/core/src/luan/modules/ThreadLuan.java Fri May 20 18:35:20 2016 -0600 +++ b/core/src/luan/modules/ThreadLuan.java Mon May 23 16:16:03 2016 -0600 @@ -1,7 +1,11 @@ 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; @@ -12,6 +16,7 @@ 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(); @@ -38,4 +43,29 @@ }; } + 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); + } + }
--- a/core/src/luan/modules/Time.luan Fri May 20 18:35:20 2016 -0600 +++ b/core/src/luan/modules/Time.luan Mon May 23 16:16:03 2016 -0600 @@ -54,12 +54,13 @@ return cal.getTimeInMillis() end -function M.period( days, hours, minutes, seconds, millis ) +function M.period( t ) local cal = Calendar.getInstance() cal.setTimeZone(TimeZone.getTimeZone("GMT")) + local days = t.days or 0 days = days + 1 - cal.set( 1970, 0, days, hours or 0, minutes or 0, seconds or 0 ) - cal.set( Calendar.MILLISECOND, millis or 0 ) + cal.set( 1970, 0, days, t.hours or 0, t.minutes or 0, t.seconds or 0 ) + cal.set( Calendar.MILLISECOND, t.millis or 0 ) return cal.getTimeInMillis() end