博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Synchronized Using
阅读量:5797 次
发布时间:2019-06-18

本文共 2146 字,大约阅读时间需要 7 分钟。

/** 
*    
*/
 

package
 concurent; 


/* 
* Thread 
*/
 

class
 Person 
extends
 Thread{ 

  Bank bank=
null

  
int
 from; 

  
int
 to; 

  
double
 amount; 

  
public
 Person(Bank bank2, 
int
 i, 
int
 j, 
double
 d) { 

    
this
.bank=bank2; 

    
this
.from=i; 

    
this
.to=j; 

    
this
.amount=d; 

  } 


  
public
 
void
 run(){ 

    
//get bank size 

    System.out.println(
"The bank size:"
+bank.size()); 

    
//out accounts 

    bank.out(); 

    
//transfer 

    
try
 { 

      bank.transfer(from, to, amount); 

    } 
catch
 (InterruptedException e) { 

      
// TODO Auto-generated catch block 

      e.printStackTrace(); 

    } 

    
//out accounts    

    bank.out(); 

  } 



/** 
* @author daniel    
* This case main show three thread transfer money in the same bank 
*/
 

public
 
class
 BankTest { 


  
/** 
    * @param args 
    */
 

  
public
 
static
 
void
 main(String[] args) { 

    Bank bank=
new
 Bank(3,100.00); 

    Person p1=
new
 Person(bank,0,1,50.00); 

    Person p2=
new
 Person(bank,0,1,100.00); 

    Person p3=
new
 Person(bank,1,0,60.00); 

    p1.start(); 

    p2.start(); 

    p3.start(); 

  } 



/** 
* Bank model 
* @author daniel 
*/
 

class
 Bank { 

  
private
 
final
 
double
[] accounts;    

     

  
/** 
    * Constructs the bank 
    * @param n 
    * @param initialBalance 
    */
 

  
public
 Bank(
int
 n, 
double
 initialBalance){ 

    accounts=
new
 
double
[n]; 

    
for
(
int
 i=0;i<accounts.length;i++){ 

      accounts[i]=initialBalance;        

    } 

  } 

    

  
/** 
    * Transfers money from one account to another 
    * @param from 
    * @param to 
    * @param amount 
    * @throws InterruptedException 
    */
 

  
public
 
synchronized
 
void
 transfer(
int
 from, 
int
 to, 
double
 amount) 
throws
 InterruptedException{ 

    
while
(accounts[from]<amount) 

      wait(); 

    System.out.println(Thread.currentThread()); 

    accounts[from] -=amount; 

    System.out.printf(
"%10.2f from %d to %d"
,amount,from,to); 

    accounts[to] +=amount; 

    System.out.printf(
"     Total Balance: %10.2f%n"
, getTotalBalance()); 

    notifyAll(); 

  } 


  
/** 
    * Gets the sum of all account balances 
    * @return 
    */
 

  
public
 
synchronized
 
double
 getTotalBalance() { 

    
double
 sum =0 ;     

    
for
(
double
 a : accounts){ 

      sum+=a; 

    } 

    
return
 sum; 

  } 

    

  
public
 
void
 out(){ 

    
for
(
int
 i=0;i<accounts.length;i++){ 

      System.out.println(
"accounts["
+i+
"]:"
+accounts[i]); 

    } 

  } 

  
/** 
    * get the number of accounts in the bank 
    * @return 
    */
 

  
public
 
int
 size(){ 

    
return
 accounts.length; 

  } 

     本文转自danni505 51CTO博客,原文链接:http://blog.51cto.com/danni505/212649,如需转载请自行联系原作者

你可能感兴趣的文章
mk-parallel-dump快速备份mysql数据库命令
查看>>
CentOS升级gcc
查看>>
高可用集群HA(heartbeat)
查看>>
关于oracle找回误删数据
查看>>
其它基于 FreeBSD 的各类 BSD 发行版
查看>>
加密解密技术基础、PKI及创建私有CA
查看>>
Web页中使用MediaPlayer
查看>>
apache htpasswd命令用法详解
查看>>
使用MMC管理windows机器
查看>>
Redis命令学习笔记
查看>>
步步为营 C# 技术漫谈 四、垃圾回收机制(GC) 中
查看>>
CIDR与VLSM的区别
查看>>
Spring Boot--自定义Starter之spring-boot-starter-quartz
查看>>
iOS开发,UIWebview与H5之间的交互
查看>>
poll 示例
查看>>
给scrapy设置HTTP代理
查看>>
Elastix的TCP/UDP端口映射
查看>>
Linux时间变慢解决方法
查看>>
如何利用python使用libsvm
查看>>
python:numpy(文件存取)
查看>>