Java tutorial
public class SyncBlock extends Object { private Object longLock; public SyncBlock() { longLock = new Object(); } public void doStuff() { print("about to try to get exclusive access " + "to longLock"); synchronized (longLock) { print("got exclusive access to longLock"); try { Thread.sleep(10000); } catch (InterruptedException x) { } print("about to relinquish exclusive access to " + "longLock"); } } private static void print(String msg) { String name = Thread.currentThread().getName(); System.err.println(name + ": " + msg); } private static Thread launch(final SyncBlock sb, String name) { Runnable r = new Runnable() { public void run() { print("in run()"); sb.doStuff(); } }; Thread t = new Thread(r, name); t.start(); return t; } public static void main(String[] args) { try { SyncBlock sb = new SyncBlock(); Thread t1 = launch(sb, "T1"); Thread.sleep(500); Thread t2 = launch(sb, "T2"); Thread t3 = launch(sb, "T3"); Thread.sleep(1000); print("about to interrupt T2"); t2.interrupt(); print("just interrupted T2"); } catch (InterruptedException x) { x.printStackTrace(); } } }