Java多线程实现自然同步(内含演示案例)
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多线程实现自然同步(内含演示案例)的更多相关文章
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- Java多线程-线程的同步(同步方法)
线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...
- Java多线程-线程的同步与锁
一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏.例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package ...
- Java多线程与线程同步
六.多线程,线程,同步 ①概念: 并行:指两个或多个在时间同一时刻发生(同时发生) 并发:指两个或多个事件在同一时间段内发生 具体概念: 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多 ...
- JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch
今天继续学习其它的同步工具:CyclicBarrier与CountDownLatch 一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ...
- java ->多线程_线程同步、死锁、等待唤醒机制
线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l 我们通过一个案例,演示线 ...
- java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决
0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...
- Java多线程 3 线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- [java多线程] - 锁机制&同步代码块&信号量
在美眉图片下载demo中,我们可以看到多个线程在公用一些变量,这个时候难免会发生冲突.冲突并不可怕,可怕的是当多线程的情况下,你没法控制冲突.按照我的理解在java中实现同步的方式分为三种,分别是:同 ...
随机推荐
- SectionIndexer中的getSectionForPosition()与getPositionForSection()解惑
大家在做字母索引的时候常常会用到SectionIndexer这个类,里面有2个重要的方法 1. getSectionForPosition()通过该项的位置,获得所在分类组的索引号 2. ge ...
- Jquery 大纲
1,核心 核心函数 对象訪问 数据缓存 队列控制 插件机制 多库共存 2.选择器 基本选择器 层级 基本 内容 可见性 属性 子元素 表单 表单对象属性 3.文档处理 内部插入 外部插入 包裹 替换 ...
- 计算机图形学(一) 视频显示设备_1_CRT原理
第 1 章 图形系统概述 如今.计算机图形学的作用与应用已经得到了广泛承认.大量的图形硬件和软件系统已经应用 到了差点儿全部的领域.通用计算机甚至很多手持计算器也已经普遍具备 二维及三维 ...
- meta 标签的学习
meta name="viewport" content="width=device-width,initial-scale=1.0" 解释 <meta ...
- js 内置对象常用方法
1 内容概述 js包含一些内置对象,如Array,Function,String等,这些是基本的,常用的js类,所以了解它们十分重要:把他们的方法,用例子和文字简要的记录下来,方便今后参看. 2 Ar ...
- oracle 数据库中,应用程序里的连接探測语句的正确使用
oracle 数据库中,应用程序里的连接探測语句的正确使用 本文为原创文章.转载请注明出处:http://blog.csdn.net/msdnchina/article/details/3851376 ...
- C语言 · 求存款
算法提高 3-2求存款 时间限制:1.0s 内存限制:256.0MB 问题描述 见计算机程序设计基础(乔林)P50第5题. 接受两个数,一个是用户一年期定期存款金额,一个是按照百分比 ...
- C# Dictionary 复制
Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictionary.Add(" ...
- Android应用双击返回键退出
@Override public void onBackPressed() { // TODO 退出提示 if (System.currentTimeMillis() - mExitTime > ...
- BI开发之——Mdx基础语法(转至指尖流淌)
Mdx为MultiDimensional Expressions的缩写,多维表达式,是标准的OLAP查询语言.在多数OLAPServer都提供Mdx支持,如Microsoft Sql Server ...