/// <summary> The method that is run by the thread. This method first joins the
/// idle state in the pool and then enters an infinite loop. In this
/// loop it waits until a target to run exists and runs it. Once the
/// target's run() method is done it re-joins the idle state and
/// notifies the waiting lock object, if one exists.
///
/// <P>An interrupt on this thread has no effect other than forcing a
/// check on the target. Normally the target is checked every time the
/// thread is woken up by notify, no interrupts should be done.
///
/// <P>Any exception thrown by the target's 'run()' method is catched
/// and this thread is not affected, except for 'ThreadDeath'. If a
/// 'ThreadDeath' exception is catched a warning message is printed by
/// the 'FacilityManager' and the exception is propagated up. For
/// exceptions which are subclasses of 'Error' or 'RuntimeException'
/// the corresponding error condition is set and this thread is not
/// affected. For any other exceptions a new 'RuntimeException' is
/// created and the error condition is set, this thread is not affected.
///
/// </summary>
override public void Run()
{
// Join the idle threads list
Enclosing_Instance.putInIdleList(this);
// Permanently lock the object while running so that target can
// not be changed until we are waiting again. While waiting for a
// target the lock is released.
lock (this)
{
while (true)
{
// Wait until we get a target
while (target == null)
{
try
{
System.Threading.Monitor.Wait(this);
}
catch (System.Threading.ThreadInterruptedException e)
{
}
}
// Run the target and catch all possible errors
try
{
target.Run();
}
//UPGRADE_NOTE: Exception 'java.lang.ThreadDeath' was converted to 'System.InvalidOperationException' which has different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1100'"
catch (System.Threading.ThreadAbortException td)
{
// We have been instructed to abruptly terminate
// the thread, which should never be done. This can
// cause another thread, or the system, to lock.
FacilityManager.getMsgLogger().printmsg(CSJ2K.j2k.util.MsgLogger_Fields.WARNING, "Thread.stop() called on a ThreadPool " + "thread or ThreadDeath thrown. This is " + "deprecated. Lock-up might occur.");
throw td;
}
catch (System.InvalidOperationException e)
{
Enclosing_Instance.targetE = e;
}
//UPGRADE_NOTE: Exception 'java.lang.Throwable' was converted to 'System.Exception' which has different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1100'"
catch (System.Exception e)
{
// A totally unexpected error has occurred
// (Thread.stop(Throwable) has been used, which should
// never be.
Enclosing_Instance.targetRE = new System.Exception("Unchecked exception " + "thrown by target's " + "run() method in pool " + Enclosing_Instance.poolName + ".");
}
// Join idle threads
Enclosing_Instance.putInIdleList(this);
// Release the target and notify lock (i.e. wakeup)
target = null;
if (lock_Renamed != null)
{
lock (lock_Renamed)
{
if (doNotifyAll)
{
System.Threading.Monitor.PulseAll(lock_Renamed);
}
else
{
System.Threading.Monitor.Pulse(lock_Renamed);
}
}
}
}
}
}