课后习题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