Java学习之路0806<复习>(线程wait 、notify)
2015-08-16 20:15
447 查看
public class MyRunnable1 implements Runnable{ String Lock1="abc"; String Lock2="def"; @Override public void run() { // TODO Auto-generated method stub System.out.println("1开始启动"); synchronized (Lock1) { // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } System.out.println("释放Lock1,等待Lock2"); try { Lock1.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("等待Lock2"); synchronized (Lock2) { System.out.println("等到了Lock2,1完成"); } } } }
public class MyRunnable2 implements Runnable{ String Lock1="abc"; String Lock2="def"; @Override public void run() { // TODO Auto-generated method stub System.out.println("2开始启动"); synchronized (Lock2) { // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } System.out.println("等待Lock1"); synchronized (Lock1) { System.out.println("2完成"); System.out.println("唤醒lock1"); Lock1.notify(); } } } }
public class RunnableTest { public static void main(String[] args) { MyRunnable1 r1=new MyRunnable1(); MyRunnable2 r2=new MyRunnable2(); Thread t1=new Thread(r1); Thread t2=new Thread(r2); t1.start(); // try { // Thread.sleep(3000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } t2.start(); } }
运行结果:
1开始启动
释放Lock1,等待Lock2
2开始启动
等待Lock1
2完成
唤醒lock1
等待Lock2
等到了Lock2,1完成
生产者与消费者
public class Product { private int num; public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
public class Consumer implements Runnable{ private Product pro; public Consumer(Product pro) { this.pro=pro; } @Override public void run() { // TODO Auto-generated method stub while (true) { synchronized (pro) { System.out.println("消费者到仓库"); if (pro.getNum()!=0) { System.out.println("消费了一件产品"); pro.setNum(0); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { pro.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
public class Producer implements Runnable{ private Product pro; public Producer(Product pro) { this.pro=pro; } @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(500); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } synchronized (pro) { System.out.println("生产者生产"); if (pro.getNum()==0) { System.out.println("生产一件产品"); pro.setNum(1); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } pro.notify(); } } } }
public class ProductTest { public static void main(String[] args) { Product pro=new Product(); Producer producer=new Producer(pro); Consumer consumer=new Consumer(pro); Thread t1=new Thread(producer); Thread t2=new Thread(consumer); t1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t2.start(); } }
运行结果:
生产者生产
生产一件产品
消费者到仓库
消费了一件产品
生产者生产
生产一件产品
消费者到仓库
消费了一件产品
生产者生产
生产一件产品
消费者到仓库
消费了一件产品
生产者生产
生产一件产品
消费者到仓库
消费了一件产品
生产者生产
生产一件产品
消费者到仓库
消费了一件产品
相关文章推荐
- 即将改变软件开发的5个Java 9新特性
- JAVA反射机制获取类和方法
- 【Java设计模式】单例模式
- Java心得14
- 《Java设计模式》之外观模式
- java面向对象程序设计:对象
- hdu 1850 Being a Good Boy in Spring Festival(Nimm Game)
- Scala入门到精通——第二十八节 Scala与JAVA互操作
- struts_ognl详解
- Javaweb之 servlet 开发详解1
- Javaweb之 servlet 开发详解1
- 大龄屌丝自学笔记--Java零基础到菜鸟--002
- Java初级培训笔记------容器 (2)
- java实例:1的数目
- Spring MVC入门教程(二)
- spring项目,数据字典信息写入缓存
- JAVA多线程实现的三种方式
- java运行机制:跨平台的原因
- (4)java方法区
- java正则表达式