OK, sorry for the repeated messages. The list apparently doesn't allow
attachments...
--- TaskManager.java 2010-03-02 11:49:30.629703600 -0600
+++ TaskManager2.java 2010-06-08 11:11:54.309412900 -0500
@@ -190,10 +190,13 @@
logAdd(t); //DAS 6/06 add
boolean poke = true;
while (threads.size() < maxThreads && needThread()) {
- Thread th;
+ TaskThread th;
try {
th = new TaskThread();
- th.start();
+ Thread thread = new Thread(new TaskThread());
+ thread.setName("task");
+ thread.setDaemon(true);
+ thread.start();
} catch (Throwable tt) {
try {
logger.log(threads.isEmpty() ?
@@ -290,8 +293,8 @@
for (int j = threads.size(); --j >= 0; ) {
TaskThread thread = (TaskThread)threads.get(j);
if (thread.task == t) {
- if (thread != Thread.currentThread())
- thread.interrupt();
+ if (thread.myThread !=
Thread.currentThread())
+ thread.myThread.interrupt();
break;
}
}
@@ -327,15 +330,11 @@
return maxThreads;
}
- private class TaskThread extends Thread {
+ private class TaskThread implements Runnable {
/** The task being run, if any */
public Task task = null;
-
- public TaskThread() {
- super("task");
- setDaemon(true);
- }
+ public Thread myThread = null;
/**
* Find the next task that can be run, and mark it taken by
@@ -363,8 +362,9 @@
}
public void run() {
+ myThread = Thread.currentThread();
while (true) {
synchronized (TaskManager.this) {
if (terminated)
return;
if (task != null) {
@@ -376,11 +376,11 @@
}
}
task = null;
- interrupted(); // clear interrupt bit
+ myThread.interrupted(); // clear interrupt bit
}
if (!takeTask()) {
try {
TaskManager.this.wait(timeout);
} catch (InterruptedException e) {
}
if (terminated || !takeTask()) {
-----Original Message-----
From: Christopher Dolan [mailto:[email protected]]
Sent: Tuesday, June 08, 2010 11:13 AM
To: [email protected]
Subject: RE: com.sun.jini.thread lock contention
Oops, let me try that patch one more time...
Chris
-----Original Message-----
From: Christopher Dolan
Sent: Tuesday, June 08, 2010 11:11 AM
To: '[email protected]'
Subject: RE: com.sun.jini.thread lock contention
Attached is a minimalist initial patch. I'm not happy that I had to
store a reference to the thread in the Runnable... But otherwise I
wasn't sure how to interrupt it from removeTask() without a separate map
of TaskThread to Thread. There's all a null pointer race in this patch
if you try to remove a task before it's run() method executes.
Chris