view 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 source

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);
	}

}