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中实现同步的方式分为三种,分别是:同 ...
随机推荐
- mysql innodb的重要组件
innodb包涵如下几个组件 一.innodb_buffer_pool: 1 它主要用来缓存数据与索引(准确的讲由于innodb中的表是由聚集索引组织的,所以数据只不是过主键这个索引的叶子结点). 二 ...
- mysql create table 语法详解
create table 可以分成三类 一.一般create table 语句: 1 语法 create [temporary] table [if not exists] tbl_name (cre ...
- ecshop报错”Deprecated: Assigning the return value of…”解决办法
ECSHOP生成站点地图提示”Deprecated: Assigning the return value of new by reference is deprecated in…”. 我的问题在批 ...
- Oracle10g 安装步骤
一.Oracle10g 安装预备步骤 取得 Oracle 10g 安装程序,或从 Oracle 技术网(OTN)下载光盘映像.在评估阶段您可以免费下载和使用无技术限制的全功能 Oracle,但在正式的 ...
- Atitit.获取验证码图片通过web
Atitit.获取验证码图片通过web 1. WebRequest进行较为底层的访问(不推荐) 1 2. WebBrowser截图 1 3. 剪贴板复制法Clipboard(推荐) 1 4. C# 取 ...
- nginx rewrite目录对换
/123/xxx----->xxx?id=123 [root@web01 default]# pwd /app/www/default [root@web01 └── sss └── index ...
- Struts2初学 Struts.xml详解二
A.使用继承实现设置全局视图 package节点中还可以设置全局的视图,如: <global-results> <result name="e ...
- Debian8.0 搭建leanote
参考了官方wiki以及中文博客 https://github.com/leanote/leanote/wiki http://leanote.leanote.com/post/Leanote-manu ...
- 坑爹的A标签 href
A标签 href在与click事件同时响应时,如果click事件有提交表单动作,href会阻拦表单提交,解决 1.去掉href 2.href="javascript:void();" ...
- FMC—扩展外部 SDRAM
本章参考资料:< STM32F4xx 参考手册 2>.< STM32F4xx 规格书>.库帮助文档< stm32f4xx_dsp_stdperiph_lib_um.chm ...