java線程之間的通信
阿新 • • 發佈:2018-05-22
AS hang ace 獲取 try 之間 ktr public dex
1.常用的方法
sleep()該線程進入等待狀態,不釋放鎖
wait() 該線程進入等待狀態,釋放鎖
notify() 隨機喚醒一個線程
notifyAll() 喚醒全部線程
2.線程之間的通信
a.兩個線程之間的通信
public class ThreadExchange { @Test public void test2Thread() { MyPrint myPrint = new MyPrint(); new Thread(new Runnable() { @Override public void run() { while (true) { try { myPrint.printA(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { try { myPrint.printB(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } class MyPrint { private Integer flag = 0; public synchronized void printA() throws InterruptedException { if (flag != 0) { this.wait(); } System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.println("a"); flag = 1; this.notify(); } public synchronized void printB() throws InterruptedException { if (flag != 1) { this.wait(); } System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.println("b"); flag = 0; this.notify(); } }
b.三個以上的線程之間的通信
方式一
public class ThreadExchange { @Test public void test2Thread() { MyPrint myPrint = new MyPrint(); new Thread(new Runnable() { @Override public void run() { while (true) { try { myPrint.printA(); }catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { try { myPrint.printB(); }catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } class MyPrint { private Integer flag = 0; public synchronized void printA() throws InterruptedException { if (flag != 0) { this.wait(); } System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.println("a"); flag = 1; this.notify(); } public synchronized void printB() throws InterruptedException { if (flag != 1) { this.wait(); } System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.println("b"); flag = 0; this.notify(); } } 2.三個以上的線程之間的通信 public class ThreadExchange { @Test public void test2Thread() { final MyPrint p = new MyPrint(); new Thread() { public void run() { while (true) { try { p.print1(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while (true) { try { p.print2(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while (true) { try { p.print3(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } } class MyPrint { private int flag = 1; public void print1() throws InterruptedException { synchronized(this) { while(flag != 1) { this.wait(); } System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.println("a"); flag = 2; this.notifyAll(); } } public void print2() throws InterruptedException { synchronized (this) { while (flag != 2) { this.wait(); } System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.println("b"); flag = 3; this.notifyAll(); } } public void print3() throws InterruptedException { synchronized (this) { while (flag != 3) { this.wait(); } System.out.print("c"); System.out.print("c"); System.out.print("c"); System.out.print("c"); System.out.println("c"); flag = 1; this.notifyAll(); } } }
方式二
public class ThreadExchange { @Test public void test3Thread() { final MyPrint p = new MyPrint(); new Thread() { public void run() { while (true) { try { p.print1(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while (true) { try { p.print2(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while (true) { try { p.print3(); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } } class MyPrint { private ReentrantLock r = new ReentrantLock(); private Condition c1 = r.newCondition(); private Condition c2 = r.newCondition(); private Condition c3 = r.newCondition(); private int flag = 1; public void print1() throws InterruptedException { r.lock(); // 獲取鎖 if (flag != 1) { c1.await(); } System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.print("a"); System.out.println("a"); flag = 2; c2.signal(); r.unlock(); // 釋放鎖 } public void print2() throws InterruptedException { r.lock(); if (flag != 2) { c2.await(); } System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.print("b"); System.out.println("b"); flag = 3; c3.signal(); r.unlock(); } public void print3() throws InterruptedException { r.lock(); if (flag != 3) { c3.await(); } System.out.print("c"); System.out.print("c"); System.out.print("c"); System.out.print("c"); System.out.println("c"); flag = 1; c1.signal(); r.unlock(); } }
java線程之間的通信