class Res { public String userName; public String sex; } class InputThread extends Thread { private Res res; public InputThread(Res res) { this.res = res; } @Override public void run() { int count = 0; while (true) { synchronized (res) { if (count == 0) { res.userName = "余胜军"; res.sex = "男"; } else { res.userName = "小红"; res.sex = "女"; } count = (count + 1) % 2; } } } } class OutThrad extends Thread { private Res res; public OutThrad(Res res) { this.res = res; } @Override public void run() { while (true) { synchronized (res) { System.out.println(res.userName + "," + res.sex); } } } } public class ThreadDemo01 { public static void main(String[] args) { Res res = new Res(); InputThread inputThread = new InputThread(res); OutThrad outThrad = new OutThrad(res); inputThread.start(); outThrad.start(); } }
这种方式的问题在于,会进行屡次消费java
多线程之间通信,其实就是多个线程在操做同一个资源,可是操做的动做不一样。安全
注意:必定要在线程同步中使用,而且是同一个锁的资源多线程
class Res { public String userSex; public String userName; //线程通信标识 public boolean flag = false; } class IntThrad extends Thread { private Res res; public IntThrad(Res res) { this.res = res; } @Override public void run() { int count = 0; while (true) { synchronized (res) { if (res.flag) { try { // 当前线程变为等待,可是能够释放锁 res.wait(); } catch (Exception e) { } } if (count == 0) { res.userName = "小军"; res.userSex = "男"; } else { res.userName = "小紅"; res.userSex = "女"; } count = (count + 1) % 2; res.flag = true; // 唤醒当前线程 res.notify(); } } } } class OutThread extends Thread { private Res res; public OutThread(Res res) { this.res = res; } @Override public void run() { while (true) { synchronized (res) { if (!res.flag) { try { res.wait(); } catch (Exception e) { // TODO: handle exception } } System.out.println(res.userName + "--" + res.userSex); res.flag = false; res.notify(); } } } } public class ThreaCommun { public static void main(String[] args) { Res res = new Res(); IntThrad intThrad = new IntThrad(res); OutThread outThread = new OutThread(res); intThrad.start(); outThread.start(); } }
对于sleep()方法,咱们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。并发
sleep()方法致使了程序暂停执行指定的时间,让出cpu该其余线程,可是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。ide
在调用sleep()方法的过程当中,线程不会释放对象锁。this
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备线程
获取对象锁进入运行状态。code
在 jdk1.5 以后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字相似的同步功能,但须要在使用时手动获取锁和释放锁。对象
Lock lock = new ReentrantLock(); lock.lock(); try{ //可能会出现线程安全的操做 }finally{ //必定在finally中释放锁 //也不能把获取锁在try中进行,由于有可能在获取锁的时候抛出异常 lock.ublock(); }
Condition的功能相似于在传统的线程技术中的,Object.wait()和Object.notify()的功能。 代码接口
Condition condition = lock.newCondition(); res. condition.await(); 相似wait res. Condition. Signal() 相似notify
class Res { public String userName; public String sex; public boolean flag = false; Lock lock = new ReentrantLock(); } class InputThread extends Thread { private Res res; Condition newCondition; public InputThread(Res res, Condition newCondition) { this.res = res; this.newCondition=newCondition; } @Override public void run() { int count = 0; while (true) { // synchronized (res) { try { res.lock.lock(); if (res.flag) { try { // res.wait(); newCondition.await(); } catch (Exception e) { // TODO: handle exception } } if (count == 0) { res.userName = "小军"; res.sex = "男"; } else { res.userName = "小红"; res.sex = "女"; } count = (count + 1) % 2; res.flag = true; // res.notify(); newCondition.signal(); } catch (Exception e) { // TODO: handle exception }finally { res.lock.unlock(); } } // } } } class OutThrad extends Thread { private Res res; private Condition newCondition; public OutThrad(Res res,Condition newCondition) { this.res = res; this.newCondition=newCondition; } @Override public void run() { while (true) { // synchronized (res) { try { res.lock.lock(); if (!res.flag) { try { // res.wait(); newCondition.await(); } catch (Exception e) { // TODO: handle exception } } System.out.println(res.userName + "," + res.sex); res.flag = false; // res.notify(); newCondition.signal(); } catch (Exception e) { // TODO: handle exception }finally { res.lock.unlock(); } // } } } } public class ThreadDemo01 { public static void main(String[] args) { Res res = new Res(); Condition newCondition = res.lock.newCondition(); InputThread inputThread = new InputThread(res,newCondition); OutThrad outThrad = new OutThrad(res,newCondition); inputThread.start(); outThrad.start(); } }
本文由博客一文多发平台 OpenWrite 发布!