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. Android4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程. Launcher其实是贯彻于手机的整个系统的,时时刻刻都 ...

  2. mongoDB 简单使用

    mongodb传送门: # 第三方学习地址: http://blog.csdn.net/foruok/article/details/47746057 # 下载mongoDB https://www. ...

  3. cocos2dx 3.x 开发环境搭建

    1. 准备工作 (1)VS2012 (2)cocos2dx cn.cocos2d-x.org/download (3)python 新版本的cocos2dx 需要python编译 2. 安装软件 (1 ...

  4. 0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter

    浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json.xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求 ...

  5. EAV/ESS 8.x 自定义服务器正确方法+更新服务器列表

    下面用64位的ESET Smart Security 8.0.319.1进行设置自定义更新服务器说明(注:修改方法32位和64位通用) 1.  让我们先看一下ESET Smart Security 8 ...

  6. 关于Safe DOG的文件上传bypass

    Author:倾旋payloads@aliyun.com本文由科拉实验室成员倾旋原创文章 Part 1 分析 此文主要研究安全狗的数据包分析功能,由于很多人都认为安全狗是通过正则去匹配的,那么暂且那么 ...

  7. [usb]usb otg和host

    USB OTG 设备既能做主机,又能做设备.USB HOST是指主机.当OTG 插到 HOST 上,OTG 的角色 就是 device.当device 插到 OTG 上,OTG 的角色就是 HOST. ...

  8. [uboot]uboot如何引导系统

    转自:http://bbs.elecfans.com/jishu_455028_1_1.html 如6410的bootcmd和bootargs默认存在于uboot1.1.6/include/confi ...

  9. PHP——内测:新闻管理练习题及答案(自己做的)

    试题看文件:1.28练习内测:新闻管理.pdf 数据库为newssystem 表为news 表内容为 fabuxinwen.php <!DOCTYPE html PUBLIC "-// ...

  10. /proc/modules分析

    参考:redhat linux deployment guide--5.2.21.  /proc/modules This file displays a list of all modules lo ...