1. 本周学习总结

1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

(1)多线程的冲突

当我们不想一种资源被同时使用,导致最后结果不一致,解决方法:

  • 使用synchronized标记方法

  • 使用synchronized代码块

在代码块中用synchronized(this){...}包围

(2)多线程同步

以消费和生产关系为例:

  • 当供不应求的时候,消费者就需要等待即使用wait(),直到有了供应,就提醒消费者,即使用notify(),或者notifyAll()(提醒全部正在等待的线程:你们可以行动了)
  • 当供过于求时,生产者就需要等待,同样使用wait(),直到仓库可以填充货物时,提醒生产者

    注:notify()/notifyAll()方法和wait()方法都只能在被声明为synchronized的方法或代码段中调用
  • 另一种解决同步的方法(使用条件对象)

    需要搭配Lock对象来使用

    Lock lock = new ReentrantLock();

    Condition condition = lock.newCondition();

    condition.await(); //等待

    condition.signal(); //通知,唤醒线程

(3)执行器(参考书上和文档)

  • 使用ExecutorService

    shutdown()

    //会在指定任务完成后,将ExecutorService关闭

    submit()

    //提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future

    invokeAll()

    //执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表

    invokeAny()

    //如果某个任务完成,就返回结果

  • 使用ThreadPoolExecutor

    ThreadPoolExecutor是Excutor的子接口ExcutorService的子类,包含有:

    newCachedThreadPool();

    //会在必要时建立线程,Runnable可能执行新建的线程或重复利用已有的线程

    newFixedThreadPool(n);

    //可以指定在池中建立的线程数

    newSingleThreadExecutor();

    //仅使用单个线程

2. 书面作业

本次PTA作业题集多线程

互斥访问与同步访问

完成题集4-4(互斥访问)与4-5(同步访问)

1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?

  • 使用同步方法块
public  void deposit(int money){
synchronized(this){
this.balance+=money;
}
} public void withdraw(int money){
synchronized(this){
this.balance-=money;
}
  • 使用lock,unlock方法
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Account {
private Lock poolLock = new ReentrantLock();
...
public void deposit(int money){
poolLock.lock();
this.balance+=money;
poolLock.unlock();
}
public void withdraw(int money){
poolLock.lock();
this.balance-=money;
poolLock.unlock();
}
}
本题参考了ProducerConsumerTestWithLock.java

1.2 同步代码块与同步方法有何区别?

答:同步方法用synchronized修饰方法来加锁,锁的范围比较大,而同步代码块可以指是在内部的某些代码,锁的范围比较小,性能更好

1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?

答:原理就是通过获得唯一的锁来打开资源,而不允许其他线程的任务打扰,其他线程就先等待,notify()之后进入Lock Pool,当且仅当使用资源之后,把锁还回去
,即poolLock.unlock(),这时候在Lock Pool的线程才可以继续
那就套用老师给的参考代码吧(TestUnSynchronizedThread.java)
执行synchronized同步方法

使用synchronized的结果:

不使用synchronized的结果:

结果分析:

开启两个线程后,发现每次运行的线程顺序不一定相同,但是最终结果都是0,线程的开始,意味着就要占用对象资源,其他线程处于等待状态,所以加完再减,减完再加,最后的结果都一样,但是不使用synchronized,对于id++这一操作,可能这时候会有线程在执行有id--,那么两个线程都取了id的值,但是最后赋给id的是当中的某一个,这样原本结果等于0的会产生其他的结果

1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?

答:可以用wait()和notify()/notifyAll()方法来协调线程间的运行关系,或者可以使用条件对象Condition搭配Lock对象来使用;同步访问一般都要放到synchronized方法或者代码块中是为了防止多个线程抢用资源,造成不必要的麻烦

交替执行

实验总结(不管有没有做出来)

首先这题只有两个线程Thread-0和Thread-1,要想交替执行那么就需要用到wait()和notify(),而且还需要用synchronized修饰方法名,保证当前只执行一个,需要注意的是,当一个线程执行一次任务时,就要做个标记,如果接下来再执行这个线程的时候就需要wait(),那么另一个线程就有机会执行任务

互斥访问

3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

这题详见1.3

3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)

参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

  • 参考TestExecutor.java中的代码,只使用两个线程,每执行完一个任务就latch.countDown();直到计数器为0时候,释放所有等待的线程

  • 参考了testCallableFuture.java,使用Callable、Future

线程间的合作:生产者消费者问题

4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?

答:多次运行发现货物还是有剩余,结果不正常,正常情况应该都是0,为了方便查看,我将库存该为5,并添加了一些信息,结果如下,发现如果消费者无法取出货物,那么就消耗了一次取货的机会,并没有等待生产者,那么就会有库存剩余

4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)

4.3 选做:使用Lock与Condition对象解决该问题。

5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)

比如说某个程序有多个线程在运行,它的运行结果一直都和单线程运行的结果是一样的,我们就认为这个线程是安全的,比如对于i++这个操作,先取i的值,再进行自增运算,最后重新赋给i,如果存在多个线程,则对这连续的三个操作产生干扰作用,最终会影响结果的正确性,所以我们可以使用一些关键字,一些方法来保证线程安全

参考链接

选做:实验总结

6.1 4-8(CountDownLatch)实验总结

CountDownLatch latch=new CountDownLatch(n);
//先初始化计数器,没执行完一个任务,就要latch.countdown();直到降为0才notify()其他线程
ExecutorService exec= Executors.newFixedThreadPool(poolSize); //指定在池中建立固定数量线程
executorService.shutdown();
//在所有传入的runnable对象都完成后,关闭

6.2 4-9(集合同步问题)实验总结

因为ArrayList, LinkedList等都不是线程安全的,为了保证线程的安全,可以使用List list = Collections.synchronizedList(new ArrayList());它返回的实例能够保证安全,详见java学习笔记P375

6.3 较难:4-10(Callable),并回答为什么有Runnable了还需要Callable?实验总结。

实验总结:(关键代码)
for (int i = 0; i < n; i++) {
CalculateTask task=new CalculateTask(i);
taskList.add(task); //添加任务
Future<Integer> future = exec.submit(task); //提交任务
results.add(future); //获得结果,并添加到results中
} 问题回答:Callable的作用与Runnable类似,但是Runnable的run()方法没有返回值,也没办法抛出Checked Exception,但是Callable的call方法有返回值,也可以抛出异常

8.选做:编写一段代码,证明你会使用ForkJoinPool?

import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask; class Fb1 extends RecursiveTask<Long>{
public final long n;
public Fb1(long n){
this.n=n;
}
public Long compute() { if(n<10){ //如果n小于10,直接递归计算
return calculate(n);
}
ForkJoinTask<Long> subTask =new Fb1(n-1).fork(); //分解成n-1个子任务,让ForkJoinTask安排线程执行这些任务
return new Fb1(n-2).compute()+subTask.join();
}
public static long calculate(long n) {
if(n==1) return 1;
if(n==2) return 1;
return calculate(n-1)+calculate(n-2);
} }
public class Fb { public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入n:");
long n=scan.nextLong();
Fb1 f=new Fb1(n);
ForkJoinPool p=new ForkJoinPool();
System.out.println("result="+p.invoke(f)); //分而治之
scan.close();
}
}
参考书上374页

3. 码云上代码提交记录

题目集:多线程(4-4到4-10)

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图多线程PTA提交列表



201521123063 《Java程序设计》 第11周学习总结的更多相关文章

  1. 201521123045 <java程序设计>第11周学习总结

    201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...

  2. 201521123027 <java程序设计>第11周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchro ...

  3. 2018面向对象程序设计(Java)第11周学习指导及要求

    2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11)   学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...

  4. 面向对象程序设计(JAVA) 第11周学习指导及要求

    2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11)   学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...

  5. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  6. 2018-2019 2 20175230《Java程序设计》第九周学习总结

    <Java程序设计>第九周学习总结 主要内容 MySQL数据库管理系统 1.下载 2.安装 启动MySQL数据库服务器 1.启动 2.root用户 MySQL客户端管理工具 建立连接 建立 ...

  7. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  8. 20175208 《Java程序设计》第九周学习总结

    20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...

  9. 20175202 《Java程序设计》第九周学习总结

    20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...

  10. 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...

随机推荐

  1. windows 快捷方式(.lnk)代码执行漏洞(CVE-2017-8464 )[附EXP生成工具]

    最近看到网上曝光了一个windows远程代码执行的漏洞,黑客可以通过一个快捷方式在用户电脑上执行任意指令,于是便对该漏洞进行了部分分析. 1. 漏洞描述: MicrosoftWindows .LNK  ...

  2. Oracle基础--体系

    1. 连接到Oralce At the operating system prompt, enter the following command to start the SQLCommand Lin ...

  3. Jmeter+badboy环境搭建

    [JMeter安装] 1. 访问官网 下载jmeter包 http://jmeter.apache.org/ 2. 解压到安装目录 D:\Program Files (x86)\apache-jmet ...

  4. 几个简单的例子让你读懂什么是JAVA的堆栈跟踪

      简单的来说,堆栈跟踪就是我们的程序在抛出异常时使用的方法调用列表. 简单的例子 通过问题中给出的示例,我们可以准确地确定应用程序中抛出异常的位置. 我们来看看堆栈跟踪: Exception in ...

  5. Django导入外部js、css、图片等巨大的坑

    初学Django,踩过最大的坑只有之一.至今任然不是很明白. 通常我们导入外部js等文件都是 <script src="myScript.js"></script ...

  6. 刚安装Fedora 23工作站后,你必须要做的24件事

    [51CTO.com快译]Fedora 23工作站版本已发布,此后我们就一直在密切关注它.我们已经为新来读者介绍了一篇安装指南:<Fedora 23工作站版本安装指南> 还有一篇介绍如何从 ...

  7. 优雅的H5下拉刷新【minirefresh】

    序 严格的来说,这是我第一个完全投入的开源项目,它的出现是为了统一移动H5中的下拉刷新,想通过一套框架,多主题拓展方式,适应于任意需求下的任意下拉刷新场景. 另外,这个项目作为独立项目存在,希望能有更 ...

  8. Django项目之小博客

    学习了几天Django,学着做了一个简易的小博客,主要用来练习Django基本的操作. 主要用到的命令和Django包.模块等: django.urls.url django.urls.import ...

  9. Windows 8 快捷键

    三月份,Kurt Walter 在 Windows团队博客中发表了一篇介绍 Windows 8 和全新快捷键的精彩文章. Windows 8 提供了出色的触摸体验,但在我的台式机上使用了几个月后我还发 ...

  10. TF-IDF学习(python实现)

    从大一开始接触TF-IDF,一直觉得这个特别简单,,但是图样图森破,,, 即使现在来说,也似乎并非完全搞懂 核心思想: 计算词语在该文章中权重,与词语出现次数和词语价值有关 词语出现次数,重复即强调, ...