diff 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
line wrap: on
line diff
--- 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);
+	}
+
 }