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. JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们“实际意义上相等”,比较的是内容,而不是引用地址.Java中S ...

  2. Django模版中的过滤器详细解析 Django filter大全

    就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法. 过滤器看起来是这样的: {{ name|lower }} 显示的内容是变量 {{ name }} 被过滤器 lower 处 ...

  3. 父级和 子集 controller 之间的通讯

    在同个 angular.js 应用的控制器之间进行通信可以有很多种不同的方式,本文主要讲两种: 基于scope继承的方式 基于event传播的方式 基于scope继承的方式 最简单的让控制器之间进行通 ...

  4. 使用c++的cocos2d-x-3.0rc1程序公布apk

    (如今cocos2dx-x-3.0正式版已经出了.之前用的cocos2d-x-3.0rc1,就先用这个版本号吧) 0. 完毕C++项目 在cmd下使用cocos.py new命令,然后习惯性的在win ...

  5. IE10/11 滚动条自动隐藏~

    原文: http://www.cnblogs.com/xwgli/p/4463184.html 就是IE10/11滚动条自动隐藏咯~ 原因是bootstrap里面加了一句: @-ms-viewport ...

  6. python 获取当前时间的用法

    1.先导入库:import datetime 2.获取当前日期和时间:now_time = datetime.datetime.now() 3.格式化成我们想要的日期:strftime() 比如:“2 ...

  7. python操作excel之 模块 xlrd (详解)

    二.使用介绍 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open_workbook('excelFile.xls') 3.使用技巧 获取一个工作表 ...

  8. dp之多重背包hdu1114

    题目很水,不多说......... #include<stdio.h> int main() { long t,n,m,a,i,j,dp[10005],vol[505],jizhi[505 ...

  9. MapReduce编程实例5

    前提准备: 1.hadoop安装运行正常.Hadoop安装配置请参考:Ubuntu下 Hadoop 1.2.1 配置安装 2.集成开发环境正常.集成开发环境配置请参考 :Ubuntu 搭建Hadoop ...

  10. linphone 在am335x的编译过程

    环境变量: export PREFIX=/usr export HOSTTPL=arm-linux-gnueabihf export INSTALLDIR=/home/elinux/linphone/ ...