1.准备一个生产者类:

public class Producer extends Thread{

    private String name;
private Market mkt;
static int count; public Producer(String name, Market mkt) {
super(name);
this.mkt = mkt;
} @Override
public void run() {
this.name = Thread.currentThread().getName();
System.out.println(name+"开始生产了!");
for (int i = 0; i < 5; i++) {
try {
Thread.sleep((long)(2000*Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
}
count ++;
String goods = "商品"+count;
mkt.set(goods);
}
System.out.println(name+"生产完成!");
}
}

2.准备一个消费者类:

public class Consumer extends Thread{

    private String name;
private Market mkt; public Consumer(String name,Market mkt){
super(name);
this.mkt = mkt;
} @Override
public void run() {
this.name = Thread.currentThread().getName();
System.out.println(name+"开始消费了!");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long)(2000*Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
}
String shoppingCart = mkt.get();
sb.append(shoppingCart).append(" | ");
}
System.out.println(name+"消费者购物完毕,所购清单如下:");
System.out.println("\t"+sb);
}
}

3.准备一个商场类:

public class Market {

    private String shelf;
private boolean flag; public synchronized void set(String goods){
String name = Thread.currentThread().getName();
while(flag){
try {
System.out.println(name+"试图上货但货架已满,请等待消费!");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.shelf = goods;
this.flag = true;
System.out.println(name+"已将"+goods+"上货,可以消费了!");
this.notify();
} public synchronized String get(){
String name = Thread.currentThread().getName();
while(!flag){
System.out.println(name+"试图购物,但货架已空,请等待上货!");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String shoppingCart = shelf;
this.shelf = null;
this.flag = false;
System.out.println(name+"购买了一个"+shoppingCart+"!");
this.notify();
return shoppingCart;
}
}

4.测试类:

public class Start {
public static void main(String[] args) {
Market mkt = new Market();
Producer p1 = new Producer("工人1", mkt);
Producer p2 = new Producer("工人2", mkt);
Consumer c = new Consumer("顾客", mkt);
p2.start();
c.start();
p1.start();
}
}

Java多线程实现自然同步(内含演示案例)的更多相关文章

  1. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  2. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

  3. Java多线程-线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏.例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package ...

  4. Java多线程与线程同步

    六.多线程,线程,同步 ①概念: 并行:指两个或多个在时间同一时刻发生(同时发生) 并发:指两个或多个事件在同一时间段内发生 具体概念: 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多 ...

  5. JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch

    今天继续学习其它的同步工具:CyclicBarrier与CountDownLatch 一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ...

  6. java ->多线程_线程同步、死锁、等待唤醒机制

    线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l  我们通过一个案例,演示线 ...

  7. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

  8. Java多线程 3 线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  9. [java多线程] - 锁机制&同步代码块&信号量

    在美眉图片下载demo中,我们可以看到多个线程在公用一些变量,这个时候难免会发生冲突.冲突并不可怕,可怕的是当多线程的情况下,你没法控制冲突.按照我的理解在java中实现同步的方式分为三种,分别是:同 ...

随机推荐

  1. android 实现全屏代码

    设置全屏包括两个部分: 窗口全屏和Activity全屏. 窗口全屏 是指隐藏系统顶部用来显示时间.电量.信号等信息的标题栏 . Activity全屏 是指隐藏程序的标题栏.我们可以通过修改Androi ...

  2. 我的SpringMvc学习之路之注解

    用注解取代配置文件可降低编程是不必要的麻烦和错误. @Controller  控制器定义 在一个class的上面写上@controller声明此类为控制器类.在配置中*.dispatcher.xml里 ...

  3. unity, 替换shader渲染(Rendering with Replaced Shaders)

    实现特效,尤其是一些后处理特效,经常需要将各物体的shader替换为另一套shader进行渲染到纹理,再后再进行合成或以某种叠加方式叠加到最后的画面上去. 再复杂一点儿的,可能不同的物体所用的替换sh ...

  4. spring概念简介、bean扫描与注册实现方式

    写在前面:本文作为整理,包含很多个人理解,有跳跃成份,初学者如果看晕了,可以先看其它同类文章,或者……多看几遍. 一.概念部分: 1.spring概念:网上有很多 2.spring核心:IOC(DI) ...

  5. 3、Cocos2dx 3.0游戏开发找小三之搭建开发环境

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27107295 搭建开发环境 使用 Cocos2d- ...

  6. Hystrix使用Commond的三种方式

    目录(?)[-] 1 依赖引入 2 使用 21 Hystrix command 211 同步执行 212 异步执行 213 反应执行 214 三种模式使用区别 22 Fallback 23 Error ...

  7. [转]Device Context 设备环境 设备上下文 理解

    http://blog.csdn.net/p424671075/article/details/7235601

  8. android 获取屏幕高度和宽度 的方法

    我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现.下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即可获取屏幕的尺寸.    在一个Activity的onC ...

  9. RadioButton单选按钮的使用

    namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { Initialize ...

  10. linux 链接的使用 创建和删除符号连接(软、硬链接)

    1 . 使用方式 :ln [option] source_file dist_file   (source_file是待建立链接文件的文件,dist_file是新创建的链接文件)            ...