1、实验目的与要求

(1) 掌握线程同步的概念及实现技术;

(2) 线程综合编程练习

2、实验内容和步骤

实验1:测试程序并进行代码注释。

测试程序1:

l 在Elipse环境下调试教材651页程序14-7,结合程序运行结果理解程序;

l 掌握利用锁对象和条件对象实现的多线程同步技术。

package synch;/*** This program shows how multiple threads can safely access a data structure.* * @version 1.31 2015-06-21* @author Cay Horstmann*/
public class SynchBankTest {public static final int NACCOUNTS = 100;public static final double INITIAL_BALANCE = 1000;public static final double MAX_AMOUNT = 1000;public static final int DELAY = 10;public static void main(String[] args) {Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);for (int i = 0; i < NACCOUNTS; i++) {int fromAccount = i;Runnable r = () -> {try {while (true) {int toAccount = (int) (bank.size() * Math.random());double amount = MAX_AMOUNT * Math.random();bank.transfer(fromAccount, toAccount, amount);Thread.sleep((int) (DELAY * Math.random()));// 在指定的毫秒数内让当前正在执行的线程休眠
                    }} catch (InterruptedException e) {}};Thread t = new Thread(r);// 分配新的 Thread 对象t.start();// 开始线程
        }}
}SynchBankTest

package synch;import java.util.*;
import java.util.concurrent.locks.*;/*** A bank with a number of bank accounts that uses locks for serializing access.* * @version 1.30 2004-08-01* @author Cay Horstmann*/
public class Bank {private final double[] accounts;private Lock bankLock;private Condition sufficientFunds;/*** Constructs the bank.* * @param n*            the number of accounts* @param initialBalance*            the initial balance for each account*/public Bank(int n, double initialBalance) {accounts = new double[n];Arrays.fill(accounts, initialBalance);bankLock = new ReentrantLock();sufficientFunds = bankLock.newCondition();}/*** Transfers money from one account to another.* * @param from*            the account to transfer from* @param to*            the account to transfer to* @param amount*            the amount to transfer*/public void transfer(int from, int to, double amount) throws InterruptedException {bankLock.lock();// 加锁try {while (accounts[from] < amount)sufficientFunds.await();// 锁对象的条件对象System.out.print(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());sufficientFunds.signalAll();// 唤醒所有等待线程} finally {bankLock.unlock();// 解锁
        }}/*** Gets the sum of all account balances.* * @return the total balance*/public double getTotalBalance() {bankLock.lock();// 加锁try {double sum = 0;for (double a : accounts)sum += a;return sum;} finally {bankLock.unlock();// 解锁
        }}/*** Gets the number of accounts in the bank.* * @return the number of accounts*/public int size() {return accounts.length;}
}Bank

测试程序2:

l 在Elipse环境下调试教材655页程序14-8,结合程序运行结果理解程序;

l 掌握synchronized在多线程同步中的应用。

package synch2;/*** This program shows how multiple threads can safely access a data structure,* using synchronized methods.* * @version 1.31 2015-06-21* @author Cay Horstmann*/
public class SynchBankTest2 {public static final int NACCOUNTS = 100;public static final double INITIAL_BALANCE = 1000;public static final double MAX_AMOUNT = 1000;public static final int DELAY = 10;public static void main(String[] args) {Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);for (int i = 0; i < NACCOUNTS; i++) {int fromAccount = i;Runnable r = () -> {try {while (true) {int toAccount = (int) (bank.size() * Math.random());double amount = MAX_AMOUNT * Math.random();bank.transfer(fromAccount, toAccount, amount);Thread.sleep((int) (DELAY * Math.random()));// 在指定的毫秒数内让当前正在执行的线程休眠
                    }} catch (InterruptedException e) {}};Thread t = new Thread(r);// 分配新的 Thread 对象t.start();// 使线程开始执行
        }}
}SynchBankTest2

package synch2;import java.util.*;/*** A bank with a number of bank accounts that uses synchronization primitives.* * @version 1.30 2004-08-01* @author Cay Horstmann*/
public class Bank {private final double[] accounts;/*** Constructs the bank.* * @param n*            the number of accounts* @param initialBalance*            the initial balance for each account*/public Bank(int n, double initialBalance) {accounts = new double[n];Arrays.fill(accounts, initialBalance);}/*** Transfers money from one account to another.* * @param from*            the account to transfer from* @param to*            the account to transfer to* @param amount*            the amount to transfer*/public synchronized void transfer(int from, int to, double amount) throws InterruptedException {while (accounts[from] < amount)wait();// 添加一个线程到等待集中System.out.print(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 the total balance*/public synchronized double getTotalBalance() {double sum = 0;for (double a : accounts)sum += a;return sum;}/*** Gets the number of accounts in the bank.* * @return the number of accounts*/public int size() {return accounts.length;}
}Bank

测试程序3:

l 在Elipse环境下运行以下程序,结合程序运行结果分析程序存在问题;

l 尝试解决程序中存在问题。

class Cbank

{

private static int s=2000;

public   static void sub(int m)

{

int temp=s;

temp=temp-m;

try {

Thread.sleep((int)(1000*Math.random()));

}

catch (InterruptedException e)  {              }

s=temp;

System.out.println("s="+s);

}

}

class Customer extends Thread

{

public void run()

{

for( int i=1; i<=4; i++)

Cbank.sub(100);

}

}

public class Thread3

{

public static void main(String args[])

{

Customer customer1 = new Customer();

Customer customer2 = new Customer();

customer1.start();

customer2.start();

}

}

运行结果:

class Cbank {private static int s = 2000;public synchronized static void sub(int m) {int temp = s;temp = temp - m;try {Thread.sleep((int) (1000 * Math.random()));} catch (InterruptedException e) {}s = temp;System.out.println("s=" + s);}
}class Customer extends Thread {public void run() {for (int i = 1; i <= 4; i++)Cbank.sub(100);}
}public class Thread3 {public static void main(String args[]) {Customer customer1 = new Customer();Customer customer2 = new Customer();customer1.start();customer2.start();}
}

实验2 编程练习

利用多线程及同步方法,编写一个程序模拟火车票售票系统,共3个窗口,卖10张票,程序输出结果类似(程序输出不唯一,可以是其他类似结果)。

Thread-0窗口售:第1张票

Thread-0窗口售:第2张票

Thread-1窗口售:第3张票

Thread-2窗口售:第4张票

Thread-2窗口售:第5张票

Thread-1窗口售:第6张票

Thread-0窗口售:第7张票

Thread-2窗口售:第8张票

Thread-1窗口售:第9张票

Thread-0窗口售:第10张票

public class Demo {public static void main(String[] args) {Mythread mythread = new Mythread();Thread t1 = new Thread(mythread);Thread t2 = new Thread(mythread);Thread t3 = new Thread(mythread);t1.start();t2.start();t3.start();}
}class Mythread implements Runnable {int t = 1;boolean flag = true;@Overridepublic void run() {// TODO Auto-generated method stubwhile (flag) {try {Thread.sleep(500);} catch (Exception e) {// TODO: handle exception
                e.printStackTrace();}synchronized (this) {if (t <= 10) {System.out.println(Thread.currentThread().getName() + "窗口售:第" + t + "张票");t++;}if (t > 10) {flag = false;}}}}
}

三、实验总结:

这次实验比起前几次来说不算难,完成得也比较轻松,接下来的时间主要是复习之前的知识,为期末考试做准备。

转载于:https://www.cnblogs.com/xuezhiqian/p/10162933.html

201771010112罗松《面向对象程序设计(java)》第十七周学习总结相关推荐

  1. 201871010115——马北《面向对象程序设计JAVA》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  2. 201671010117 2016-2017-2 《Java程序设计》Java第十七周学习心得

    Java第十七周学习心得 这一周老师对线程的内容进行了详细讲解,包括线程创建的两种技术,和线程的优先级属性及调度方法,对于布置的实验作业中,实验九中存在一点问题,程序运行不出来,后来跟同学商量探讨没有 ...

  3. 《数据结构与面向对象程序设计》第1周学习总结

    20182316胡泊 2019-2020-1 <数据结构与面向对象程序设计>第1周学习总结 教材学习内容总结 简单java程序是有哪些部分组成的 Java程序好的排版布局是怎样的 程序开发 ...

  4. 四十八.面向对象程序设计——Java语言第一周编程题:分数

    题目内容: 设计一个表示分数的类Fraction.这个类用两个int类型的变量分别表示分子和分母. 这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这个类要 ...

  5. 201771010112罗松《面向对象程序设计(java)》第三周学习总结

    实验三  Java基本程序设计 201771010112  罗松 1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3) ...

  6. 达拉草201771010105《面向对象程序设计(java)》第十七周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十七周学习总结 第一部分:理论知识 1.多线程的概念: (1)多线程是进程执行过程中产生的多条执行线索. (2)多线程意味着 ...

  7. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

  8. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  9. 张云飞 201771010143 《面对对象程序设计(java)》第十七周学习总结

    张云飞 201771010143 <面对对象程序设计(java)>第十七周学习总结 1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 2.实验内容和步骤 ...

  10. 计算机JAVA相关说课稿_面向对象程序设计-java说课稿

    面向对象程序设计-java说课稿 面向对象程序设计-JAVA说课稿,计算机系 毕景霞,目录,一.说教材 二.说教学目标 三.说重点难点 四.说教学方法 五.说教学内容 六.教学效果及总结,(一)教材的 ...

最新文章

  1. 新特效火爆抖音!各路神仙齐唱《蚂蚁呀嘿》,网友:短短几秒需一生来治愈...
  2. 图像中里面的Ground Truth
  3. pre标签 首行会自动换行解决方案
  4. SQL Server表分区
  5. pico8 掌机_使用Pico-8构建自己的复古游戏
  6. mysql老叶博客_MySQL binlog后面的编号最大是多大?【老叶茶馆公众号】
  7. saltstack系列~第四篇
  8. keeplive+haproxy+nginx
  9. 好用的 windows10 软件推荐
  10. Origin2017、Origin2018详细安装教程
  11. 重构之前的数据统计,用于数据归档,要考虑数据迁移
  12. 10.5 Vue电商后台管理完善--订单详情页面显示商品信息,添加备注
  13. 生物信息流程开发之甲基化分析pipeline
  14. 逍遥模拟器微信提示无法连接服务器,轻松解决夜神逍遥模拟器模拟器等模拟器无法连接问题...
  15. linuxcentos6笔记
  16. Python爬取美女主播图片适合初学者
  17. Rosalind Java| Counting Point Mutations
  18. 华为诺亚方舟实验室简述
  19. slxrom+v.21+原生android+4.2,小米MIX2S 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  20. 成都天瑞地安:学java开发的一些重要知识

热门文章

  1. 飞秋2013设置后无法保存配置问题
  2. Ubuntu 使用firefox插件下载百度云文件
  3. 《阳光下》 ——【传递正反馈】
  4. 读书文摘卡 -《大秦帝国》
  5. mybatis自定义枚举类型的转换器以及各种使用场景
  6. 【OpenCV 例程300篇】48. 直方图处理之彩色直方图匹配
  7. ubuntu增加swap交换空间
  8. Android Transition
  9. PHP中使用 fsockopen curl 模拟异步处理
  10. 软件能力成熟度模型CMM