疯狂java讲义第16章多线程课后习题答案

课后习题p779
1、

2、

练习书上例子并说明它的用意

补充习题
1、尝试使用Android Studio的单步调试功能。

2、说出线程池和连接池的区别和联系

3、使用继承Thread的方法创建两个线程,并且分别修改类变量和实例变量,看看能不能共享类变量。

4、说出java实现线程的3中方法分别是什么。并且说出他们之间的区别和联系。优势劣势。适用场景。

5、实现Runnable接口创建线程类。一个打印我是帅哥。一个打印我是美女。两个线程都加上对应count。并且命名为帅哥和美女

6、说出继承Thread和实现Runnable这两种方法的区别。

7、使用Callable和Future创建线程

8、说出为什么Callable类提供的call方法要比run方法多出可以有返回值和可以声明抛出异常这两个功能?还有为什么Callable为什么不能作为Thread的target?

9、还是不太理解泛型,p738

10、调用run方法并直接用getName看看返回什么?

11、线程的状态怎么转变?有多少种状态?转换的规则是什么?

12、同步监听器是什么?怎么使用?作用是什么?写一个例子。

13、suspend方法为什么容易导致死锁?写一个例子。stop又为什么容易导致死锁?

14、如何控制线程的阻塞和唤醒?有几种办法?为什么要分wait、notify和suspend和resume?他们有什么区别?为什么会有yield这个方法?

15?为什么一个线程只能使用一次?不能重复利用?

16、写一个join线程的例子并说出join的作用?
作用:其实就是把子线程的代码放到join处,相当于在join处顺序执行子线程代码。

17、说出后台进程是什么?有什么作用?怎么设置?有什么特征?
从守护进程这个名称来理解:前台进程就是守护进程要守护的东西,当前台进程都执行完成了,也就没有东西守护了,也就一起消失了。应该是用来为前台线程服务的,没有消费也就没有生产的必要。

18、写一个例子证明前台线程创建的子线程默认是前台线程,后台线程创建的子线程默认是后台线程

19、说出sleep和yield的区别。写一个例子证明。结合改变线程的优先级。

20、说出设置优先级的代码和设置守护线程的代码位置有什么区别?设置优先级的代码可不可以在start之前?

21、尝试p750的例子不过传入不同线程两个不同的account,看看结果如何?

22、说出synchronized关键字的用法有几种?分别是什么?synchronized代码块和synchronized方法有什么不同?

23、写一个例子使用同步方法。p751说同步方法的同步监视器是this,那不同线程的this肯定不同?不懂。

24、说出领域驱动设计的设计方式的理念。

25、p753的疑惑,不论是方法同步还是synchronized代码块不都是锁定了对象吗?那怎么区别对待?

26、说出何时会释放对同步监听器的锁定?

27、说出为什么要提供同步锁(Lock)这种方式?ReadWriteLock和Lock的区别和联系是什么?StampedLock是什么作用?为什么提供?为什么要叫可重入锁?

28、如何使用synchronized代码块锁定多个对象?

29、synchronized和Lock的区别和联系?p755的且必须在与所有锁被获取时相同的范围内释放所有锁,这句话是什么意思?必须在最外层synchronized的范围内?

30、什么时候会使用try finally这样的结构?尝试用synchronized和lock分别设计一个死锁。

31、什么叫非块结构的tryLock()方法?什么叫可中断锁的lockInterruptibly()方法?什么叫超时失效锁的tryLock(long,TimeUnit)方法?p755,不理解ReentrantLock的可重入性是什么意思?自己尝试写一个多次加锁。

32、如果不调用unlock会怎样?一段被锁保护的代码可以调用另一个被相同锁保护的方法,这句话什么意思?

33、如何解决死锁问题?

34、如何实现死锁检测?

35、如何使用wait、notify和notifyAll进行传统线程通信?

36、什么方法会释放对同步监视器的锁定?

37、p758的Account类,对两个方法用synchronized修饰了,那么如果有一个线程调用了a方法,那另一个线程能同时调用b方法吗?如果按照书上的说法同步监视器是实例本身,那就是不可以,但是我自己要试一下。

38、wait方法有没有类似continue的意思?就是直接终止这次调用。p760的线程协调结果,自己运行一下,看下取钱者是不是完整的取了100次钱。在取钱输出中加上count计数

39、为什么wait、notify、notifyAll要和synchronized关键字结合使用?为什么Lock对象要和Condition结合使用?尝试分别使用这两套实现同一个功能。比如

40、p761的提供多个等待集wait-set是什么意思?还有关于notify和signal唤醒线程的随意性(书上说是随机的),会不会受到线程优先级的影响?写一个例子进行验证。

41、p763什么叫做线程通信?是通过synchronized块+wait,notify,notifyAll和Lock+Condition这样的方式实现同步吗?这样就叫做线程通信??我感觉通信的意思是传输数据,和线程同步还是不一样的,,,但是这里的意思好像是线程同步和线程通信是一个东西。。还有了解一下管道流进行线程通信的方式。

42、BlockingQueue使用put和take方法,造成的阻塞是指,阻塞结束后还会完成放入或者取出的尝试?还是直接跳过此次行为?要试一下。说出BlockingQueue提供的3种类型的方法组合。并说出BlockingQueue5个实现类的区别和联系,有什么特点,

43、p764什么叫做 对SynchronousQueue的存、取操作必须交替进行?

44、为什么线程不能中途改变所属线程组?线程组的名字可以重复吗?线程组有什么作用?为什么要有这个东西?

45、p767如何处理线程的异常处理?还有为什么是ThreadDeath对象就不做任何处理?
p768中,异常传播给上一级调用者,不知道这句话是什么意思?

46、说出线程池的作用,和连接池的关系。不太理解什么叫做工厂方法,为什么叫工厂方法?为什么会有SingleThreadExecutor这种创建一个只有单线程的线程池的方法?这个和不用线程池的效果基本差不多吧?这么少的线程有什么作用呢?

47、p769为什么叫newWorkStealingPool这个名字?还会使用多个队列来减少竞争是什么意思?还有Future对象将在run()方法执行结束后返回null是什么意思?类型参数中使用?和T或者K这样的形式有什么区别?

48、尝试一下写一个例子,来说明使用线程池和不使用线程池之间的性能差距有多大。

49、线程池的原理是什么?怎么实现线程的复用?自己尝试一下,

50、尝试在shutdown之后,继续submit,看看会怎样。

51、不是有了WorkStealingPool了吗?为什么还要一个ForkJoinPool利用多CPU?多cpu和多核cpu是什么区别?通用池功能是什么意思?有什么用处?getCommonPoolParallelism返回的并行级别是什么意思?submit和invoke方法有什么区别?是不是平时使用线程池都要使用ForkJoinPool,不用其他的?
p773的left.join()+right.join()这个代码看不懂

52、尝试使用并理解ThreadLocal类的作用,并理解"和让每个线程创建一个该变量的副本"这句话,和直接继承Thread这种方法有什么区别?

53、p775的图16.16中,为什么两个线程是顺序执行的?巧合吗?ThreadLocal这种方式的同步机制和普通同步机制有什么区别?分别应该在什么时候使用?线程相关状态其实是会被多线程访问的可修改变量吧?

54、p776类图中的虚线实线是什么含义?还有o-又是什么意思?“该迭代器可能不能反映出创建迭代器之后所做的修改,但程序不会抛出任何异常。”这句话是什么意思?聚集操作什么意思?缓存实现类又是什么?

55、java9新增的发布订阅框架,有什么用?p777“不需要使用数据中心来缓冲数据”是什么意思?怎么使用?什么时候应该用?

56、静态内部接口有什么意义吗?为什么这么用?

57、p777下面的?那句话不理解。字符串和synchronized(xxx)的妙用,是不是和我猜想的一样?p778。p779可以有多个订阅者接收一次发布的数据项吗?自己写一个例子试一试。

58、尝试一下,多线程对于StringBuilder和StringBuffer的操作,看看结果,还有对于未包装的集合和包装后的集合也看看结果。然后故意写一个多线程会发生错误的例子。

需要练习java文档的类

1、Thread

2、Runnable

3、Callable

4、Future+FutureTask

5、TimeUnit

6、Lock+ReentrantLock

7、ReadWriteLock+ReentrantReadWriteLock

8、StampedLock

9、Condition

10、BlockingQueue

11、ArrayBlockingQueue

12、LinkedBlockingQueue

13、PriorityBlockingQueue

14、SynchronousQueue

15、DelayQueue

16、ThreadGroup

17、ThreadDeath

18、Executors

19、ExecutorService

20、ScheduledExecutorService

21、ForkJoinPool+RecursiveAction+RecursiveTask

22、ThreadLocal

23、ConcurrentMap+ConcurrentHashMap

24、ConcurrentSkipListMap

25、ConcurrentSkipListSet

26、ConcurrentLinkedQueue

27、ConcurrentLinkedDeque

28、CopyOnWriteArrayList

29、CopyOnWriteArraySet

30、NavigableMap+ConcurrentNavigableMap

31、Flow+Flow.Publisher+Flow.Subscription+Flow.Processor+SubmissionPublisher

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细水长流cpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值