两个线程,一个输出1,3,5,7......99;另一个输出2,4,6,8......100。
1.线程同步
1 public class ST2 { 2 int i = 0; 3 4 public static void main(String[] args) { 5 ST2 st1 = new ST2(); 6 new Thread(st1.new Inc()).start(); 7 new Thread(st1.new Dec()).start(); 8 } 9 10 private synchronized void inc(){ 11 i++; 12 try { 13 Thread.currentThread().sleep(1000); 14 } catch (InterruptedException e) { 15 e.printStackTrace(); 16 } 17 System.out.println(Thread.currentThread().getName()+" +++ "+i); 18 } 19 20 private synchronized void dec(){ 21 i--; 22 try { 23 Thread.currentThread().sleep(1000); 24 } catch (InterruptedException e) { 25 e.printStackTrace(); 26 } 27 System.out.println(Thread.currentThread().getName()+" ----- "+i); 28 } 29 30 class Inc implements Runnable{ 31 @Override 32 public void run() { 33 while(true) 34 inc(); 35 } 36 } 37 38 class Dec implements Runnable{ 39 @Override 40 public void run() { 41 while(true) 42 dec(); 43 } 44 } 45 }
输出:
Thread-1 ----- -1 Thread-1 ----- -2 Thread-0 +++ -1 Thread-0 +++ 0 Thread-0 +++ 1 Thread-0 +++ 2 Thread-1 ----- 1 Thread-0 +++ 2 Thread-1 ----- 1 Thread-1 ----- 0 Thread-1 ----- -1 Thread-1 ----- -2 Thread-0 +++ -1 Thread-0 +++ 0 Thread-0 +++ 1 Thread-1 ----- 0 Thread-1 ----- -1 Thread-1 ----- -2 Thread-1 ----- -3 Thread-1 ----- -4 Thread-0 +++ -3 Thread-0 +++ -2 Thread-0 +++ -1 Thread-0 +++ 0
从这里可以看出,线程随机执行。
2.控制线程执行顺序
1 private synchronized void inc() throws Exception{ 2 b = true; 3 notifyAll(); 4 i++; 5 System.out.println(Thread.currentThread().getName()+" ++ "+i); 6 7 Thread.currentThread().sleep(1000); 8 9 while(b) 10 wait(); 11 } 12 13 private synchronized void dec() throws Exception { 14 while(!b) 15 wait(); 16 i++; 17 System.out.println(Thread.currentThread().getName()+" ++++ "+i); 18 19 Thread.currentThread().sleep(1000); 20 21 b = false; 22 notifyAll(); 23 }
输出:
Thread-0 ++ 1 Thread-1 ++++ 2 Thread-0 ++ 3 Thread-1 ++++ 4 Thread-0 ++ 5 Thread-1 ++++ 6 Thread-0 ++ 7 Thread-1 ++++ 8 Thread-0 ++ 9 Thread-1 ++++ 10 Thread-0 ++ 11 Thread-1 ++++ 12 Thread-0 ++ 13 Thread-1 ++++ 14 Thread-0 ++ 15 Thread-1 ++++ 16 Thread-0 ++ 17 Thread-1 ++++ 18 Thread-0 ++ 19 Thread-1 ++++ 20 Thread-0 ++ 21
3.控制线程执行次数
1 class Inc implements Runnable{ 2 @Override 3 public void run() { 4 for(int j=0 ; j<50; j++){ 5 try { 6 inc(); 7 } catch (Exception e) { 8 e.printStackTrace(); 9 } 10 } 11 } 12 } 13 14 class Dec implements Runnable{ 15 @Override 16 public void run() { 17 for(int j=0 ; j<50; j++){ 18 try { 19 dec(); 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24 } 25 }