201621123065《JAVA程序设计》第11周学习总结

1. 本周学习总结

2. 书面作业

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

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

BallRunnable类实现Runnable接口,支持多线程;调用Thread.sleep进行休眠则在规定时间内不参与参与到CPU竞争,让线程休眠就可以看到小球的运动轨迹,如果时间为0即Thread.Sleep(0),就触发操作系统立刻重新进行一次CPU竞争就看不见轨迹。

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

  • 实现小球的移动方法;获得小球的坐标和大小
  • BallComponent对象的作用是添加小球和画出小球
  • ArrayList用于存放小球
  • 运行中生成了一个BallComponent对象
  • 是的每个小球是分别在不同的线程中进行绘制

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

2.1 题目:6-1(Thread)、6-3(Runnable-匿名内部类)。回答:a)通过定义Runnable接口的实现类来实现多线程,比继承自Thread类实现多线程有何好处?b) 6-1,6-3,6-11实验总结。

定义Runniable接口比继承Thread类实现多线程的好处:

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

6-1实验总结:
创建MyThread类对象时指定循环次数n,再创建一个输出从0到n-1的整数的任务即可。

6-3实验总结:
创建代表任务的Runnable实现类的对象,在任务里面写要求的三行输出。

6-11实验总结:
这个题与6-1相似,就是要多实现一个Runnable接口。

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

改写如下:

Thread t1 new Thread (( ) - >{
				System.out.println(mainThreadName);
				System.out.println(Thread.currentThread().getName());
				System.out.println(Arrays.toString(getClass().getInterfaces()));
			});

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

a)不能使用stop()!!!stop()方法已经被废弃;可以使用共享变量的方式,共享变量可以被多个执行相同任务的线程用来作为是否中断的信号,通知中断线程的执行;也可以使用interrupt方法终止线程,这种方法用于线程阻塞时终止线程。

b)public void stopMe();和public void sendWord(String word)方法就编写语句flag = true;this.word = word;就可以实现,主要是run()方法,对word包含alien按格式进行输出,要注意加入while(!flag)语句来判断程序的执行或终止。

3. 互斥访问

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


4. 互斥访问与同步访问

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

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

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

用synchronized的同步代码块实现互斥同步访问

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

同步代码块 :
即有synchronized关键字修饰的语句块。
被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
方法如下:

synchronized(object){ 
    }

同步方法 :
    即有synchronized关键字修饰的方法。 
    由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 
    内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
方法:

public synchronized void save(){}

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

原理:对象锁,在程序中,每个对象都有一把锁,只有获得了对象锁,才能执行相应的synchronized代码块或者方法,共享资源在一个时间段内只允许一个线程访问,访问完了另一个线程才能访问,运用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;
    }
}

某一线程竞争获得对象锁,其余线程在等待池中等待线程释放对象锁,当线程释放对象锁其余线程又开始竞争对象锁,直到程序结束

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

使用wait ()、notify()、notifyAll()关键字实现线程之间的通信

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

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


两次放入取出相同,但结果却不一样;因为producer和consumer的存取速度不一致,线程之间没有合作就会产生错乱

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


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

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

6.2 运行视频

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

3.码云及PTA

3.1. 码云代码提交记录

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


3.3 统计本周完成的代码量

周数 行数 新增行数 文件数 新增文件数
第一周 39 39 9 9
第二周 278 239 18 9
第三周 431 153 33 15
第四周 894 182 51 9
第五周 1154 260 67 16
第六周 1354 200 79 12
第七周 1463 109 85 6
第八周 1776 313 101 16
第九周 1903 127 106 5
第十周 2136 233 122 16
第十一周 2861 725 146 24
posted @ 2017-12-02 17:00  Devilss  阅读(302)  评论(1编辑  收藏  举报