Re: Converting Java into J/link runnable code
- To: mathgroup at smc.vnet.net
- Subject: [mg104461] Re: Converting Java into J/link runnable code
- From: David Bailey <dave at removedbailey.co.uk>
- Date: Sun, 1 Nov 2009 03:59:45 -0500 (EST)
- References: <hcgmt3$cui$1@smc.vnet.net>
Garapata wrote: > J/link seems like a good way to go to set up timers so, I found this > short Java example that sets up a recurring beep. If I can get it to > work, I can do a lot of other things with the ideas: > > import java.sql.Date; > import java.util.Timer; > import java.util.TimerTask; > import java.awt.Toolkit; > > public class Main { > public static void main (String[] argv) throws Exception { > Date timeToRun = > new Date (System.currentTimeMillis() + > numberOfMillisecondsInTheFuture); > Timer timer = new Timer(); > > timer.schedule (new TimerTask() { > public void run() { > Toolkit.getDefaultToolkit.beep(); > } > }, timeToRun); > } > } > ______________ First, the Java code as written is partly schematic because the variable numberOfMillisecondsInTheFuture needs to be replaced by an actual value. Also, the Timer should be set up as a Daemon thread by passing the argument true. If you make these changes, you end up with some runnable Java code: import java.sql.Date; import java.util.Timer; import java.util.TimerTask; import java.awt.Toolkit; public class Main { public static void main (String[] argv) throws Exception { Date timeToRun = new Date (System.currentTimeMillis() + 1117); Timer timer = new Timer(true); timer.schedule (new TimerTask() { public void run() { Toolkit.getDefaultToolkit().beep(); } }, timeToRun); } } To test this code, save it in a file Main.java, and type javac Main.java java Main OK - so now you have some Java code that works on its own, so now you can try hooking it up to Mathematica. First change the Class name to something more sensible - e.g. MyTimerClass, and provide a method which is not called Main, and which accepts the actual time delay you require: import java.sql.Date; import java.util.Timer; import java.util.TimerTask; import java.awt.Toolkit; public class MyTimerClass { public static void myTimer (int numberOfMillisecondsInTheFuture) throws Exception { Date timeToRun = new Date (System.currentTimeMillis() + numberOfMillisecondsInTheFuture); Timer timer = new Timer(true); timer.schedule (new TimerTask() { public void run() { Toolkit.getDefaultToolkit().beep(); } }, timeToRun); System.out.println("????????"); } } This should be stored in a file called MyTimerClass.java (the names of source files are important in java) and compiled: javac MyTimerClass.java This will make a file MyTimerClass.class Here is the Mathematica code required to call this static method: In[1]:= Needs["JLink`"] In[3]:= AddToClassPath["c:\\myjava"]; In[4]:= LoadJavaClass["MyTimerClass"]; In[8]:= MyTimerClass`myTimer[2000] Replace the path c:\\myjava" with the directory containing your .class file, and away you go! Note that you can't just splice the Java source into your Mathematica program as you have done! Also, you do not need to load the classes that are used internally by your Java code. Alternatively, it would be possible to avoid compiling any Java code, by breaking up the steps inside myTimer into individual J/Link calls, but this is somewhat less general, and probably more error prone. David Bailey http://www.dbaileyconsultancy.co.uk