Recommended: Sing it, brah! 5 fabulous songs for developers
JW's Top 5
Optimize with a SATA RAID Storage Solution
Range of capacities as low as $1250 per TB. Ideal if you currently rely on servers/disks/JBODs
Page 4 of 8
tg maximum priority = 10
t1 priority = 5
t1 priority after setPriority() = 6
tg maximum priority after setMaxPriority() = 4
t1 priority after setMaxPriority() = 6
t2 priority = 4
t2 priority after setPriority() = 4
Thread group A (which tg references) starts with the highest priority (10) as its maximum. Thread X, whose Thread object t1 references, joins the group and receives 5 as its priority. We change that thread's priority to 6, which succeeds because
6 is less than 10. Subsequently, we call setMaxPriority(int priority) to reduce the group's maximum priority to 4. Although thread X remains at priority 6, a newly-added Y thread receives 4 as its priority. Finally, an attempt to increase thread Y's priority to 5 fails, because 5 is greater than 4.
Note: setMaxPriority(int priority) automatically adjusts the maximum priority of a thread group's subgroups.
In addition to using thread groups to limit thread priority, you can accomplish other tasks by calling various ThreadGroup methods that apply to each group's thread. Methods include void suspend(), void resume(), void stop(), and void interrupt(). Because Sun Microsystems has deprecated the first three methods (they are unsafe), we examine only interrupt().
ThreadGroup's interrupt() method allows a thread to interrupt a specific thread group's threads and subgroups. This technique would prove appropriate
in the following scenario: Your application's main thread creates multiple threads that each perform a unit of work. Because
all threads must complete their respective work units before any thread can examine the results, each thread waits after completing
its work unit. The main thread monitors the work state. Once all other threads are waiting, the main thread calls interrupt() to interrupt the other threads' waits. Then those threads can examine and process the results. Listing 3 demonstrates thread
group interruption:
// InterruptThreadGroup.java
class InterruptThreadGroup
{
public static void main (String [] args)
{
MyThread mt = new MyThread ();
mt.setName ("A");
mt.start ();
mt = new MyThread ();
mt.setName ("B");
mt.start ();
try
{
Thread.sleep (2000); // Wait 2 seconds
}
catch (InterruptedException e)
{
}
// Interrupt all methods in the same thread group as the main
// thread
Thread.currentThread ().getThreadGroup ().interrupt ();
}
}
class MyThread extends Thread
{
public void run ()
{
synchronized ("A")
{
System.out.println (getName () + " about to wait.");
try
{
"A".wait ();
}
catch (InterruptedException e)
{
System.out.println (getName () + " interrupted.");
}
System.out.println (getName () + " terminating.");
}
}
}
The main thread creates and starts threads A and B before sleeping for 2,000 milliseconds to give A and B a chance to wait. Upon waking, the main thread assumes A and B are waiting, and executes Thread.currentThread ().getThreadGroup ().interrupt (); to interrupt those threads. Because A and B execute in a synchronized context, one thread will throw an InterruptedException object and finish its processing before the other thread does the same. When run, InterruptThreadGroup produces the following output (for one invocation):