进程:程序的执行过程(动态概念)。它持有资源(内存、文件)和线程。
线程:程序执行流的最小单元。线程共享进程的资源。
线程的交互:互斥(竞争)和同步(合作)。
题目:有A,B,C三个线程,A线程输出A,B线程输出B,C线程输出C,要求,同时启动三个线程,按顺序输出ABC,循环10次。
PrintLetter.java:
1 public class PrintLetter 2 { 3 private char letter = 'A'; 4 5 public char getLetter() 6 { 7 return letter; 8 } 9 10 public void next()11 {12 letter = (char) ((letter - 64) % 3 + 65);13 }14 15 public void print()16 {17 System.out.print(letter);18 }19 }
ThreeThreadPrintABC.java:
1 public class ThreeThreadPrintABC 2 { 3 public static void main(String[] args) 4 { 5 ThreeThreadPrintABC foo = new ThreeThreadPrintABC(); 6 PrintLetter printLetter = new PrintLetter(); 7 Thread a = new Thread(foo.new PrintRunnable(printLetter, 'A')); 8 Thread b = new Thread(foo.new PrintRunnable(printLetter, 'B')); 9 Thread c = new Thread(foo.new PrintRunnable(printLetter, 'C'));10 a.start();11 b.start();12 c.start();13 }14 15 private class PrintRunnable implements Runnable16 {17 private char letter;18 private PrintLetter printLetter;19 20 public PrintRunnable(PrintLetter printLetter, char letter)21 {22 this.printLetter = printLetter;23 this.letter = letter;24 }25 26 public void run()27 {28 for(int i = 0; i < 10; i++)29 {30 synchronized(printLetter)31 {32 while(letter != printLetter.getLetter())33 {34 try 35 {36 printLetter.wait();37 } 38 catch (InterruptedException e) 39 {40 e.printStackTrace();41 }42 }43 printLetter.print();44 printLetter.next();45 printLetter.notifyAll();46 }47 }48 }49 }50 }
OR:
1 public class ThreeThreadPrintABC 2 { 3 private int state = 0; 4 private Object obj = new Object(); 5 6 public static void main(String[] args) 7 { 8 ThreeThreadPrintABC foo = new ThreeThreadPrintABC(); 9 Thread a = new Thread(foo.new PrintRunnable('A'));10 Thread b = new Thread(foo.new PrintRunnable('B'));11 Thread c = new Thread(foo.new PrintRunnable('C'));12 a.start();13 b.start();14 c.start();15 }16 17 private class PrintRunnable implements Runnable18 {19 private char letter;20 21 22 public PrintRunnable(char letter)23 {24 this.letter = letter;25 }26 27 public void run()28 {29 while(state < 30)30 {31 synchronized(obj)32 {33 if(letter == state % 3 + 65)34 {35 System.out.print(letter);36 letter = (char) ((letter - 64) % 3 + 65);37 state++;38 }39 }40 }41 }42 }43 }