Hi,
I checked in some of my little bugfixes and some new classes that were not
yet checked in. Here is the changelog:
* java/lang/ThreadLocal.java: new 1.2 class
* java/lang/InheritableThreadLocal.java: new 1.2 class
* vm/reference/java/lang/Thread.java: added example to use ThreadLocals
* java/lang/Package.java: new 1.2 class (but no support in ClassLoader yet)
* java/util/Timer.java: new 1.3 class
* java/util/TimerTask.java: new 1.3 class
* java/net/JarURLConnection.java: getCertificates returns a Certificate[]
* java/security/ProtectionDomain.java: constructor should make the
PermissionCollection read only
I would appreciate it if someone looked over these files to see if I
did anything stupid.
I did have a strange problem with java.util.Timer with gcj. Sometimes I
would get java.lang.IllegalMonitorStateException when testing it.
Could someone with a newer or cvs version of gcj (I have 2.95.2) try the
attached program with the java.util.Timer[Task] classes from cvs
(you have to compile them with jikes first to get class files)
and tell if you still get a IllegalMonitorException. I hope it is a bug
in gcj, but it might also very well be a bug in my code.
I have not yet checked in my beginning of java/util/jar and
java/net/URLClassLoader that I will clean up next and possibly merge with
the libgcj ones.
Cheers,
Mark
P.S. Two little notes on the build process:
- Since the javax directory is completely empty now we might want to
remove it from the Makefile (since cvs update -dP will remove the whole
directory now).
- Since java/text/DecimalFormat.java is missing (has it ever existed?)
I had to add java/text/MessageFormat.java to standard.omit.
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
static private class TaskTest extends TimerTask {
private final String name;
TaskTest(String name) {
this.name = name;
}
public void run() {
System.out.println(name + ": " + new Date());
}
}
public static void main(String args[]) {
try {
TimerTest test = new TimerTest();
test.run();
test = null;
System.out.println("Done. Waiting 3 seconds...");
try {
Thread.sleep(3000);
} catch (InterruptedException ie) {}
System.out.println("Garbage collect");
System.gc();
System.out.println("Quit");
} catch (Throwable t) {
System.out.println("Oops: " + t);
t.printStackTrace();
}
}
public void run() {
Timer timer = new Timer();
TimerTask tasks[] = new TimerTask[10];
for(int i = 1; i<=10; i++) {
try{Thread.sleep(1000);}catch(InterruptedException ie){}
System.out.println("Created task: " + i);
tasks[i-1] = new TaskTest("Task-" + i);
timer.schedule(tasks[i-1], 1000, i*1000);
}
System.out.println("All Tasks started, waiting 5 seconds...");
try{Thread.sleep(5000);}catch(InterruptedException ie){}
System.out.println("Cancel all tasks");
for(int i = 0; i<10; i++) {
try{Thread.sleep(1000);}catch(InterruptedException ie){}
System.out.println("Canceling task: " + (i+1));
tasks[i].cancel();
}
System.out.println("All tasks canceled");
}
}