201771010112罗松《面向对象程序设计(java)》第十七周学习总结
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)》第十七周学习总结相关推荐
- 201871010115——马北《面向对象程序设计JAVA》第二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201671010117 2016-2017-2 《Java程序设计》Java第十七周学习心得
Java第十七周学习心得 这一周老师对线程的内容进行了详细讲解,包括线程创建的两种技术,和线程的优先级属性及调度方法,对于布置的实验作业中,实验九中存在一点问题,程序运行不出来,后来跟同学商量探讨没有 ...
- 《数据结构与面向对象程序设计》第1周学习总结
20182316胡泊 2019-2020-1 <数据结构与面向对象程序设计>第1周学习总结 教材学习内容总结 简单java程序是有哪些部分组成的 Java程序好的排版布局是怎样的 程序开发 ...
- 四十八.面向对象程序设计——Java语言第一周编程题:分数
题目内容: 设计一个表示分数的类Fraction.这个类用两个int类型的变量分别表示分子和分母. 这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这个类要 ...
- 201771010112罗松《面向对象程序设计(java)》第三周学习总结
实验三 Java基本程序设计 201771010112 罗松 1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3) ...
- 达拉草201771010105《面向对象程序设计(java)》第十七周学习总结
达拉草201771010105<面向对象程序设计(java)>第十七周学习总结 第一部分:理论知识 1.多线程的概念: (1)多线程是进程执行过程中产生的多条执行线索. (2)多线程意味着 ...
- 【Java】《面向对象程序设计——Java语言》Castle代码修改整理
前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...
- 201771010118马昕璐《面向对象程序设计java》第八周学习总结
第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...
- 张云飞 201771010143 《面对对象程序设计(java)》第十七周学习总结
张云飞 201771010143 <面对对象程序设计(java)>第十七周学习总结 1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 2.实验内容和步骤 ...
- 计算机JAVA相关说课稿_面向对象程序设计-java说课稿
面向对象程序设计-java说课稿 面向对象程序设计-JAVA说课稿,计算机系 毕景霞,目录,一.说教材 二.说教学目标 三.说重点难点 四.说教学方法 五.说教学内容 六.教学效果及总结,(一)教材的 ...
最新文章
- 新特效火爆抖音!各路神仙齐唱《蚂蚁呀嘿》,网友:短短几秒需一生来治愈...
- 图像中里面的Ground Truth
- pre标签 首行会自动换行解决方案
- SQL Server表分区
- pico8 掌机_使用Pico-8构建自己的复古游戏
- mysql老叶博客_MySQL binlog后面的编号最大是多大?【老叶茶馆公众号】
- saltstack系列~第四篇
- keeplive+haproxy+nginx
- 好用的 windows10 软件推荐
- Origin2017、Origin2018详细安装教程
- 重构之前的数据统计,用于数据归档,要考虑数据迁移
- 10.5 Vue电商后台管理完善--订单详情页面显示商品信息,添加备注
- 生物信息流程开发之甲基化分析pipeline
- 逍遥模拟器微信提示无法连接服务器,轻松解决夜神逍遥模拟器模拟器等模拟器无法连接问题...
- linuxcentos6笔记
- Python爬取美女主播图片适合初学者
- Rosalind Java| Counting Point Mutations
- 华为诺亚方舟实验室简述
- slxrom+v.21+原生android+4.2,小米MIX2S 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
- 成都天瑞地安:学java开发的一些重要知识