201621123033 《Java程序设计》第11周学习总结

1. 本周学习总结

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

2. 书面作业

本次PTA作业题集多线程

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

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

该类调用了小球移动的函数,并在移动之后对界面进行重绘。
线程调度,让出CPU给其他线程。

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

Ball.java实现了小球的移动和获取小球的物理信息(即大小和坐标)。
BallComponent对象是用来添加小球和画小球,其内部的ArrayList用来放置小球。运行过程中,生成了一个BallCompoent对象。
不是在不同的线程中进行绘制的。

1.3 选做:程序改写:程序运行时,每个小球都是从固定位置出发。如何改写该程序,使得当点击start时,每个小球可以从不同位置出发、以不同的步进移动?

1.4 选做:不同小球的移动轨迹一模一样。改造程序,使得每个小球运行轨迹不完全一样,比如有的可以走余弦轨迹、有的可以走方波轨迹、有的走布朗运动、有的走五角星,等等。

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

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

并回答:a)通过定义Runnable接口的实现类来实现多线程程序比通过继承自Thread类实现多线程程序有何好处?b) 6-1,6-3,6-11实验总结。
a)继承Thread: 线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。
优势:

  • 适合多个相同代码的线程去处理同一个资源的情况。
  • 避免了单继承的局限性。
  • 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

b)
6-1:注意要有有参构造函数,循环打印数字后再打印标识信息(放在循环外)。
6-3:注意匿名内部类书写格式(很容易出现缺括号等等情况)。
6-11:这题基本代码和6-1差不多...就是最后输出标识信息不一样。

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

//改写
Thread t1 = new Thread(
        		()->{
        		System.out.println(mainThreadName);
        		System.out.println(Thread.currentThread().getName());
        		System.out.println(Arrays.toString(Thread.class.getInterfaces()));
        		}
   
        );

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

使用boolean标志来使线程中的run()方法退出。注意:不要使用stop()方法,因为可能会引发某些问题。

private volatile boolean flag = false;  
public void stopMe(){
		flag=true;
	}

3. 互斥访问

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

4. 互斥访问与同步访问

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

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

//201621123033
class Account1{
	private int balance;
	
	private static Lock lock=new ReentrantLock();
	
	public Account1(int balance) {
		this.balance = balance;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}

	public void deposit(int money){
		lock.lock();
		balance=balance+money;
		lock.unlock();
	}
	
	public synchronized void withdraw(int money){
		lock.lock();
		balance=balance-money;
		if(balance<0) 
	        throw new IllegalStateException(balance+"");	
		lock.unlock();
    }

}

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

同步方法是在方法名前加synchronized来修饰,同步代码块是在方法内部使用synchronized来实现加锁。由此可看出,同步方法作用范围明显比同步代码块来的大。

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

对共享资源的访问不能同时进行,当一个任务使用共享资源的时候对其上锁,这时其他任务就不能访问这个资源直到其被解锁。

class Counter {
	private static int id = 0;

	public synchronized static void addId() {
		id++;
	}

	public synchronized static void subtractId() {
		id--;
	}

	public static int getId() {
		return id;
	}
}

分析如上代码:

  1. 线程A开始工作,id被上锁,读取id的值为0
  2. 线程A将id的值+1,此时id的值为1,id被释放
  3. 线程B开始工作,id被上锁,读取id的值为1
  4. 线程B将id的值-1,此时id的值为0,id被释放

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

  • synchronized
  • Object类的wait()、notify()

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

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

运行结果不正常,显示还有货物剩余。因为Producer和Consumer的存取货速度不一样。

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


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

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

6.2 运行视频

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

3.码云及PTA

题目集:多线程

3.1. 码云代码提交记录

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

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

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


3.3 统计本周完成的代码量

需要将每周的代码统计情况融合到一张表中。

周次 总代码量 新增代码量 总文件数 新增文件数
3 547 547 12 12
5 971 424 20 8
6 1577 606 29 9
7 2187 1216 41 21
8 2793 606 49 8
9 3040 247 56 7
10 3617 577 63 7
11 3911 294 71 8
12 4409 498 82 11
原文地址:https://www.cnblogs.com/holmec/p/7954126.html