账号提钱、存钱实例方法

public class Account {
private int balance;
private int maxBalance;
public Account(int balance)
{
this.balance=balance;
}
//同步方法 取钱
public synchronized void transferOut(int money) {
//线程同步
//synchronized(this) {
String theadName=Thread.currentThread().getName();
if(balance>money) {
try {
Thread.sleep(1);
}catch(InterruptedException e ){
e.printStackTrace();
}
balance=balance-money;
System.out.println(theadName+"转走:"+money+",余额:"+balance);
}else {
System.out.println(Thread.currentThread().getName()+"余额不足");
}
// }
} //同步方法 线程等待 存钱
public synchronized void save(int money) {
while(balance+money>maxBalance) {
try {
this.wait(); //线程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String theadName=Thread.currentThread().getName();
balance=balance+money;
System.out.println( "save "+money+"元"+" balance:"+balance);
this.notifyAll();//唤醒其它线程 }
//同步方法 线程等待 存钱
public synchronized void withdraw(int money) {
while(money>balance) {
try {
this.wait(); //线程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} balance=balance-money;
System.out.println( "take "+money+"元"+" balance:"+balance);
this.notifyAll();//唤醒其它线程 }
}

  测试方法

public class Test {

    public static void main(String[] args) {

        Account account2=new Account(8000);
Thread t1=new Thread(new TakeMoney(account2),"son1");
Thread t2=new Thread(new TakeMoney(account2),"son2");
t1.start();
t2.start();
} }

java 线程同步方法执行与唤醒实例的更多相关文章

  1. 捕获Java线程池执行任务抛出的异常

    捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...

  2. Java线程池详解及实例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/aa1215018028/article/ ...

  3. ThreadPoolExecutor源码分析-面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?

    Java版本:8u261. 对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路.但是假如我是面试官,现在我想问一些更细致的问题, ...

  4. Java线程中的join使用实例

    JDK中解释为 Waits for this thread to die. 等待本线程结束后,下一个线程才可以运行. 实例要求: 现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3 ...

  5. java线程中的notifyAll唤醒操作

    注意: java中的notifyAll和notify都是唤醒线程的操作,notify只会唤醒等待池中的某一个线程,但是不确定是哪一个线程,notifyAll是针对指定对象里面的所有线程执行唤醒操作,指 ...

  6. java线程间通信1--简单实例

    线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...

  7. java线程同步方法,方法块差别

    先说同步方法.它究竟是锁定的当前对象,还是当前类 代码块1 package com.ssss; public class Thread1 implements Runnable { //public ...

  8. Java线程的等待与唤醒完整示例代码

    项目结构: 资源类: 输入线程:  输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...

  9. Java线程与多线程教程

    本文由 ImportNew - liken 翻译自 Journaldev.   Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...

随机推荐

  1. SpringBean生命周期及作用域

    bean作用域 在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象.在BeanDefinition对象中有scope 属性,就是 ...

  2. Java的值类型和引用类型

    一.问题描述 前几天因为一个需求出现了Bug.说高级点也挺高级,说白点也很简单.其实也就是一个很简单的Java基础入门时候的值类型和引用类型的区别.只是开发的时候由于自己的问题,导致小问题的出现.还好 ...

  3. flink基本原理

    一.简介 开源流式处理系统在不断地发展,从一开始只关注低延迟指标到现在兼顾延迟.吞吐与结果准确性,在发展过程中解决了很多问题,编程API的易用性也在不断地提高.本文介绍一下 Flink 中的核心概念, ...

  4. 2018HDU多校训练-3-Problem D. Euler Function

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322 Problem Description In number theory, Euler's toti ...

  5. 每个pool pg数计算

    ceph PGs per Pool Calculator 原文档:http://xiaqunfeng.cc/2017/09/18/ceph-PGs-per-Pool-Calculator/ 2017- ...

  6. Docker系列-(3) Docker-compose使用与负载均衡

    上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...

  7. python学习-class对象

    # 面向对象 python,java,c## 面向过程 C # 类和对象# 类 类型类别.类别 物以类聚 一类事物# 班级.人类.动物类.车.学生类.老师类.手机.电脑# 统称 == 共同特性# 不具 ...

  8. COCI 2012 Inspektor

    coci 2012 inspektor 街道由左到右分布着\(N\)个办公室,编号为\(1\)到\(N\),最开始,每个办公室都是空的,一些公司将入住,并赶走办公室里面现有的公司.一人每天会路过一些连 ...

  9. 多个DataTable的合并成一个新表

    多个DataTable的合并成一个新表 参考:https://www.cnblogs.com/JuneZhang/archive/2011/12/11/2284243.html

  10. mysql过期修改

    1.打开cmd 2.链接数据库如 mysql -h localhost -P 3306 -u root -proot 3.修改密码 mysql < set password for 用户名@lo ...