201521123112《Java程序设计》第11周学习总结
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

- 线程终止可以使用boolean标志使线程中的run()方法退出。
- 线程让步使用
Thead.yield()。 - 等待其他线程结束
join()。 - 可以使用synchronized修饰方法实现互斥同步访问。
2. 书面作业
本次PTA作业题集多线程
1.互斥访问与同步访问
完成题集4-4(互斥访问)与4-5(同步访问)
1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?
Java SE 5.0开始,有了锁对象 ReentrantLock,lock,unlock方法,这边可以使用lock对象和condition对象
public void deposit(int money) {
lock.lock();
try {
balance += money;
condition.signalAll();
} finally {
lock.unlock();
}
}
1.2 同步代码块与同步方法有何区别?
同步方法的作用范围是一整个方法,而同步代码块只作用于整个代码块而已,同步方法在方法的声明上加上synchronized实现加锁,同步代码块是在方法中通过synchronized关键字实现互斥。
1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
互斥访问的原理:在同一个时间,只能有一个线程访问资源,然后其他线程无法访问该资源直到它被解锁
class Test{
private static int n = 0;
public synchronized void addn(){
n++;
}
public synchronized void substractn(){
n--;
}
}
有线程t1调用addn方法 线程t2调用substractn方法
- t1先获得n的锁,获取n的值然后进行n++ ,将运算后的n存后,锁资源被解放。
- t2获得n的锁,然后获取n的值进行n--,将运算后的n存后,锁资源被解放。
1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?
一般使用wait()、notify()来实现线程之间的协同工作
将同步访问放到synchronized方法中避免多个线程访问同一个资源而产生冲突。
2.交替执行
实验总结(不管有没有做出来)
- 完成任务要将任务删除,可以定义一个Int i,
getSize = assignments - i; - 要执行交替,方法都需要用synchronized 修饰,线程之前的协作可以使用wait()、notify()来完成。
3.互斥访问
3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)
class Counter {
//201521123112
private static int id = 0;
public synchronized static void addId() {
id++;
}
public synchronized static void subtractId() {
id--;
}
public static int getId() {
return id;
}
}
3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)
public static void main(String[] args) throws InterruptedException {
ExecutorService mExecutor = Executor.newCachedThreadPool();
ArrayList<Callable<Object>> tasks = new ArrayList<>();
for(int i = 0 ;i < 3 ;i ++){
tasks.add(Executors.callable(new Adder()));
}
for(int i = 0 ;i < 3 ;i ++){
tasks.add(Executors.callable(new Subtracter()));
}
mExecutor.invokeAll(tasks);
System.out.println(Counter.getId());
System.out.println("main end");
}//201521123112
4.线程间的合作:生产者消费者问题
4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?


从运行结果上来看,第一次运行仓库还剩下十个货物,结果不正常,原因是生产者比较快,消费者在运行时数据不一致或者另一种情况
4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)

5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
- 线程安全就是当对一个线程安全的方法或者语句块进行访问的时候,其他的线程不能对该方法或者语句块进行访问,必须等腰这次访问结束之后才能在进行访问。
- 线程安全还需要注意避免出现死锁。
3. 码云上代码提交记录
3.1. 码云代码提交记录

3.2 截图多线程PTA提交列表

201521123112《Java程序设计》第11周学习总结的更多相关文章
- 201521123045 <java程序设计>第11周学习总结
201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...
- 201521123027 <java程序设计>第11周学习总结
1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchro ...
- 2018面向对象程序设计(Java)第11周学习指导及要求
2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11) 学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...
- 面向对象程序设计(JAVA) 第11周学习指导及要求
2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11) 学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 2018-2019 2 20175230《Java程序设计》第九周学习总结
<Java程序设计>第九周学习总结 主要内容 MySQL数据库管理系统 1.下载 2.安装 启动MySQL数据库服务器 1.启动 2.root用户 MySQL客户端管理工具 建立连接 建立 ...
- 20175209 《Java程序设计》第九周学习总结
20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...
- 20175208 《Java程序设计》第九周学习总结
20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...
- 20175202 《Java程序设计》第九周学习总结
20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...
- 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结
20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...
随机推荐
- Pivot-Header的花式效果
要实现如上图所示的效果分为三步: 1.重写Pivot样式,去掉Pivot的Header或者是直接使用默认的Pivot的样式然后不写Header 2.使用一个ListView或者是横向的StackPan ...
- 微信小程序——智能小秘“遥知之”源码分享(语义理解基于olami)
微信小程序智能生活小秘书开发详解 >>>>>>>>>>>>>>>>>>>>> ...
- Python 字典和集合
泛映射类型 collections.abc 模块中有 Mapping 和 MutableMapping 这两个抽象基类,它们的作用是为 dict 和其他类似的类型定义形式接口(在Python 2.6 ...
- 关于excel的导入导出
目前为方便操作,很多系统都增加了批量导入导出的功能.文件导入导出一般的格式都是excel,现将常用设计用例总结如下: 批量导入 一.模板检查检测:一般excel导入,都会提供模板下载功能 1.模板 ...
- BTrace : Java 线上问题排查神器
BTrace 是什么 BTrace 是检查和解决线上的问题的杀器,BTrace 可以通过编写脚本的方式,获取程序执行过程中的一切信息,并且,注意了,不用重启服务,是的,不用重启服务.写好脚本,直接用命 ...
- RabbitMQ --- Routing(路由)
目录 RabbitMQ --- Hello Mr.Tua RabbitMQ --- Work Queues(工作队列) RabbitMQ --- Publish/Subscribe(发布/订阅) 前言 ...
- Node.js之操作文件系统(一)
Node.js之操作文件系统(一) 1. 同步方法与异步方法 在Node.js中,使用fs模块来实现所有有关文件及目录的创建.写入及删除操作.,在fs模块中,所有对文件及目录的操作都可以使用同步与异步 ...
- IT类非开发面试总结--2
面试总结.. ================================= 第一部分..(自己对公司的最低要求) 面试需要提前准备的是:<想好自己以后要干嘛--我在想我以后要干嘛> ...
- oracle之备份详解
1.冷备份(执行冷备份前必须关闭数据库) 物理备份(备份物理数据库文件) 2.热备份(热备份是当数据库正在运行时进行数据备份的过程.执行热备份的前提是:数据库运行在可归档日志模式.适用于24X7不间断 ...
- #define和typedef在windows上的应用
typedef的应用 typedef是在计算机编程语言中用来为复杂的声明定义简单的别名. 下面的代码定义了一些常见类型的别名 typedef int INT; typedef unsigned int ...