java线程之间的通信
Posted CodeZLei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程之间的通信相关的知识,希望对你有一定的参考价值。
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线程之间的通信的主要内容,如果未能解决你的问题,请参考以下文章