进程:程序的执行过程(动态概念)。它持有资源(内存、文件)和线程。
线程:程序执行流的最小单元。线程共享进程的资源。
线程的交互:互斥(竞争)和同步(合作)。
题目:有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 Runnable 16 { 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 Runnable 18 { 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 }