[Listing One] PingPong class PingPong extends Thread { String word; // what word to print int delay; // how long to pause PingPong(String whatToSay, int delayTime) { word = whatToSay; delay = delayTime; } public void run() { try { for (;;) { System.out.print(word + " "); sleep(delay); // wait until next time } } catch (InterruptedException e) { return; // end this thread } } public static void main(String[] args) { new PingPong("ping", 33).start(); // 1/30 second new PingPong("PONG", 100).start(); // 1/10 second } } [Listing Two] Account class Account { private double balance; public Account(double initialDeposit) { balance = initialDeposit; } public synchronized double getBalance() { return balance; } public synchronized void deposit(double amount) { balance += amount; } } [Listing Three] synchronized_abs /** make all elements in the array nonnegative */ public static void abs(int[] values) { synchronized (values) { for (int i = 0; i < values.length; i++) { if (values[i] < 0) values[i] = -values[i]; } } } [Listing Four] class Queue { // The first and last elements in the queue Element head, tail; public synchronized void append(Element p) { if (tail == null) head = p; else tail.next = p; p.next = null; tail = p; notify(); // Let waiters know something arrived } public synchronized Element get() { try { while(head == null) wait(); // Wait for an element } catch (InterruptedException e) { return null; } Element p = head; // Remember first element head = head.next; // Remove it from the queue if (head == null) // Check for an empty queue tail = null; return p; } } [Listing Five] Thread spinner; // the thread doing the processing public void userHitCancel() { spinner.suspend(); // whoa! if (askYesNo("Really Cancel?")) spinner.stop(); // stop it else spinner.resume(); // giddyap! } [Listing Six] class CalcThread extends Thread { private double Result; public void run() { Result = calculate(); } public double result() { return Result; } public double calculate() { // ... } } class Join { public static void main(String[] args) { CalcThread calc = new CalcThread(); calc.start(); doSomethingElse(); try { calc.join(); System.out.println("result is " + calc.result()); } catch (InterruptedException e) { System.out.println("No answer: interrupted"); } } }