使用synchronized wait() notifyall() 实现简单的加减法同步 竞争抢答
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.concurrent.FutureTask; class Answer implements Callable<String>
{
private boolean flag = true;
@Override
public synchronized String call() throws Exception {
if(flag == true) {
Thread.sleep(100);
flag = false;
return Thread.currentThread().getName() + "抢答成功";
}
else {
return Thread.currentThread().getName() + "抢答失败";
}
}
} public class ThreadCompete {
public static void main(String[] args) {
Answer answer = new Answer();
FutureTask<String> task1 = new FutureTask<>(answer);
FutureTask<String> task2 = new FutureTask<>(answer);
FutureTask<String> task3 = new FutureTask<>(answer);
new Thread(task1).start();
new Thread(task2).start();
new Thread(task3).start();
try {
System.out.println(task1.get());
System.out.println(task2.get());
System.out.println(task3.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Resource{
private int num = 0;
private boolean flag = true;
public synchronized void add() {
while(this.flag == false) {
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.num++;
System.out.println("加法操作-" + Thread.currentThread().getName() + this.num);
this.flag = false;
super.notifyAll();
}
public synchronized void sub() {
while(this.flag == true) {
try {
super.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(80);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.num--;
System.out.println("减法操作-" + Thread.currentThread().getName() + this.num);
this.flag = true;
super.notifyAll();
}
}
class Jia implements Runnable{
private Resource resource;
public Jia(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.add();
}
}
}
class Jian implements Runnable{
private Resource resource;
public Jian(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.sub();;
}
}
}
public class ThreadJiaJian {
public static void main(String[] args) {
Resource resource = new Resource();
Jian jian = new Jian(resource);
Jia jia = new Jia(resource);
new Thread(jian,"减法线程A").start();
new Thread(jian,"减法线程B").start();
new Thread(jia,"加法线程X").start();
new Thread(jia,"加法线程Y").start();
}
}
使用synchronized wait() notifyall() 实现简单的加减法同步 竞争抢答的更多相关文章
- 如何创建一个简单的C++同步锁框架(译)
翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...
- linux/windows系统oracle数据库简单冷备同步
linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...
- 使用WinSCP进行简单代码文件同步
前言传输协议FTPFTPSSFTPSCP为什么使用WinSCP?CMD的FTP命令FileZillaPuTTYrsyncSublime的SFTP插件WinSCPWinSCP进行简单代码文件同步总结备注 ...
- 基于synchronized 或 ReadWriteLock实现 简单缓存机制
package cn.xxx.xxx; import java.util.HashMap; import java.util.Map; import java.util.concurrent.lock ...
- 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】
方法一:传统的线程方法import org.apache.log4j.Logger; /** * 两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象.<br/> * ...
- [Java Concurrent] 多线程合作 wait / notifyAll 的简单案例
本案例描述的是,给一辆汽车打蜡.抛光的场景. Car 是一辆被打蜡抛光的汽车,扮演共享资源的角色. WaxOnCommand 负责给汽车打蜡,打蜡时需要独占整部车,一次打一部分蜡,等待抛光,然后再打一 ...
- 简单的互斥同步方式——synchronized关键字详解
目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...
- Java中Synchronized的用法(简单介绍)
简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...
- 多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll
生产者消费者模式描述的是协调与协作关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者( ...
随机推荐
- 关于ioncube扩展的安装和使用
ioncube 是一个专业级的PHP加密解密工具 这里是按照此扩展的教程,安装以后就可以运行用ioncube加密的文件 引导安装说明:一.下载loader-wizard.php ioncube提供了一 ...
- Python学习笔记_week3_函数
一.介绍 1.面向对象(华山派)--->类(独门秘籍)--->class(定义的关键字) 2.面向过程(少林派)--->过程--->def 3.函数式编程(逍遥派)---> ...
- 选择、操作web元素-2
11月3日 等待web元素的出现 例子:百度搜索松勤网,点击操作后不等待页面刷新,下面选择页面元素的时候,该元素还是未出现 sleep方案的弊病:固定的等待时间,导致测试用例执行时间很长 为什么cli ...
- java 父类引用指向子类对象---动态绑定
知识点: 1.java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法: 2.父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private.非 final 方法),那么这个对 ...
- 浅谈如何避免内存泄漏(out of memory)
1.在涉及使用Context时,对于生命周期比Activity长的对象应该使用Application的Context.凡是使用Context优先考虑Application的Context,当然它并不是 ...
- 机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)
1.cv2.dilate(src, kernel, iteration) 参数说明: src表示输入的图片, kernel表示方框的大小, iteration表示迭代的次数 膨胀操作原理:存在一个ke ...
- 1047A_Little C Loves 3 I(构造)
A. Little C Loves 3 I time limit per test 1 second memory limit per test 256 megabytes input standar ...
- docker之数据卷管理
转自:https://www.cnblogs.com/jsonhc/p/7777811.html docker之数据卷的备份和还原 1.现在利用镜像创建一个nginx的服务容器,并挂载一个数据卷 [r ...
- creator.d.ts 的错误
//export class PhysicsCollider{ export class PhysicsCollider extends Collider{ ==================检查代 ...
- 趣味编程:静夜思(Python版)
from itertools import groupby def verticalWriting(txt, offset): l = lambda x: x[0] % offset for (_, ...