作业11-多线程

Posted 201621123077黄泽鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作业11-多线程相关的知识,希望对你有一定的参考价值。

1. 本周学习总结

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

2. 书面作业

本次PTA作业题集多线程

1. 源代码阅读:多线程程序BounceThread

1.1 BallRunnable类有什么用?为什么代码中需要调用Thread.sleep进行休眠?

1.BallRunnable类实现了Runnable接口,使程序实现了多线程,从而可以为线程指派任务。
2.调用Thread.sleep进行休眠的目的是为了先冻结当前线程,让其他的线程有机会优先被执行。

1.2 Ball.java只做了两件事,这两件事分别是什么?BallComponent对象是干什么的?其内部的ArrayList有什么用?程序运行过程中,生成了几个BallComponent对象?该程序使用了多线程技术,每个小球是分别在不同的线程中进行绘制吗?

  1. Ball.java实现小球的x,y轴坐标和移动的具体方法。
  2. Ball.java实现小球的具体大小,并用ArrayList存储。

2. 实验总结:题集(多线程)

2.1 题目:Thread、PrintTask、Runnable与匿名内部类。

并回答:a)通过定义Runnable接口的实现类来实现多线程程序比通过继承自Thread类实现多线程程序有何好处?b) 6-1,6-3,6-11实验总结。
a):Java无法支持多继承,所以一个类可以实现多个不同的接口,但却不能同时继承多个不同的父类,因此通过定义Runnable接口的实现类来实现多线程程序可以规避继承的局限性。
b):6-1通过编写一个My Thread类通过继承Thread来实现的
6-3通过使用匿名内部类来实现Runnable接口的run方法来完成该程序,其中在获取当前线程的名字时要调用Thread.currentThread.getname()来获得
6-11通过定义Runnable接口的实现类完成,此题为单线程。

2.2 使用Lambda表达式改写6-3

2.3 题目:6-2(Runnable与停止线程)。回答:需要怎样才能正确地停止一个运行中的线程?

首先,在Thread中有一个stop()的方法可以来结束进程,但因为强制停止会导致代码逻辑的不完整。
所以,我们可以使用退出标志,来使线程正常退出,或者使用interrupt方法中断线程。

3. 互斥访问

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

4. 互斥访问与同步访问

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

4.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法可以使用synchronized实现互斥同步访问,使用代码说明(请出现相关代码及学号)?

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

1.同步方法是直接在方法名前加synchronized来实现对方法的加锁,而同步代码块则是在方法内部对关键字进行加锁。
2.同步方法的作用范围大于同步代码块,但其本身的性能却小于同步代码块。

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

原理:当一个任务占用了某种资源之后,将其上锁,则该任务在未解锁之前有且只能使用该资源,当解锁时才能访问其他资源。

线程状态的变化:当被任务访问的资源在被上锁之后没有进行解锁就会进入lookpool状态,否则会进入runnable状态等待调整running。

4.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?

ait()、notify()
await()和signal()

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

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

不正常,最后还有剩余的货物,主要原因是存取货物的速度存在差异。

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

6. 面向对象设计作业-图书馆管理系统

6.1 系统的功能模块表格,表格中体现出每个模块的负责人。

模块 负责人
注册 张韵弢
登录 张韵弢
搜索图书 张韵弢
借阅图书 张韵弢
归还图书 张韵弢
删除图书 黄泽鑫
修改图书 黄泽鑫
添加图书 黄泽鑫

6.2 运行视频

6.3 讲解自己负责的模块,并粘贴自己负责模块的关键代码(出现学号及姓名)。

管理员对图书进行修改、删除、添加等操作
private static final int NOTFOUND = 0;
private static final int SUCCESS = 1;

`public boolean display(){
	return false;
}

public static int remove(String id){
	boolean flag = false;
	try {
		ArrayList<String> inlist = new ArrayList<String>();
		ArrayList<String> outlist = FileIO.readFile("D:/book.txt");
		String[] book;
		for (String string : outlist) {
			book = string.split(" ");
			if(book[0].equals(id)){
				flag = true;
				continue;
			}
			inlist.add(string);	
		}
		FileIO.writeFile("D:/book.txt", inlist);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	if(flag)
		return SUCCESS;
	else
		return NOTFOUND;
}

public static boolean add(String id, String name, int num){
	try {
	FileIO.appendFile("D:/book.txt", id + " " + name + " " + num);
	return true;
} catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
	return false;
}  

}

public static int correct(String id, String name, int num){
	boolean flag = false;
	try {
		ArrayList<String> inlist = new ArrayList<String>();
		ArrayList<String> outlist = FileIO.readFile("D:/book.txt");
		String[] book;
		for (String string : outlist) {
			book = string.split(" ");
			if(book[0].equals(id)){
				flag = true;
				inlist.add(id+" "+name+" "+num+"");
			}
			inlist.add(string);	
		}
		FileIO.writeFile("D:/book.txt", inlist);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	if(flag)
		return SUCCESS;
	else
		return NOTFOUND;
}

`

3.码云及PTA

题目集:多线程

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
必须出现几个要素:提交日期-用户名(姓名与学号)-不提交说明

3.2 截图"多线程"PTA提交列表

需要有两张图(1. 排名图。2.PTA提交列表图)

3.3 统计本周完成的代码量

|周次|总代码量|新增代码量|总文件数|新增文件数||
|-

以上是关于作业11-多线程的主要内容,如果未能解决你的问题,请参考以下文章

作业11-多线程

201621123068 作业11-多线程

作业11-多线程

作业11-多线程

java第11次作业

201621123018《java程序设计》第11周作业总结