Lock锁,死锁,线程组,线程池,定时器,练习题
1、Lock锁(接口)
lock();
unlock();
ReentrantLock是Lock的实现类。
2、死锁
同步的缺点:效率低,容易产生死锁。
死锁:两个或两个以上的线程,在争夺资源的过程中,发生的一种相互等待的现象。
1 public class MyLock { 2 public static final Object objA=new Object(); 3 public static final Object objB=new Object(); 4 } 5 6 public class DieLock extends Thread{ 7 8 private boolean flag; 9 10 public DieLock(boolean flag){ 11 this.flag=flag; 12 } 13 14 @override 15 public void run(){ 16 if(flag){ 17 synchronized(MyLock.objA){ 18 System.out.println("if A"); 19 synchronized(MyLock.objB){ 20 System.out.println("if B"); 21 22 } 23 } 24 }else{ 25 synchronized(MyLock.objB){ 26 System.out.println("else B"); 27 synchronzied(MyLock.objA){ 28 System.out.println("else A"); 29 } 30 } 31 } 32 } 33 } 34 35 public class Fin{ 36 public static void main(String[] args){ 37 DieLock dieLock1=new DieLock(true); 38 DieLock dieLock2=new DieLock(false); 39 dieLock1.start(); 40 dieLock2.start(); 41 } 42 } 43 44 //死锁
3、线程组
ThreadGroup类,可以对一批线程进行分类管理。
getThreadGroup();
4、线程池
Executros类,启动新线程成本太高,可以利用献线程池提高线程使用效率(用完后回收)。
newCachedThreadPool();
newFixedThreadPool();
newSingleThreadExecutor();
以上三个方法的返回值为ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或Callable对象代表的线程。
submit();
shutdown();
5、定时器
Timer类:schedule();
TimerTask类:run(); , cancel();
6、练习题
(1)多线程有哪几种实现方式?
三种:继承Thread类,实现Runnable接口,实现Callable接口(结合线程池使用)。
(2)同步有哪几种实现方式?
两种:同步代码块,同步方法。
(3)启动一个线程是run()还是start(),两者的区别是什么?
start()。
run():封装了被线程执行的代码,直接调用,相当于普通方法的调用。
start():启动线程,并由JVM自动调用run()方法。
(4)sleep()和wait()的区别是什么?
sleep():必须指定时间;不释放锁。
wait():可以指定时间,也可以不指定时间;释放锁。
(5)为什么wait()、notify()、notifyAll()都定义在Object类中?
因为这些方法的调用,依赖于锁对象,而同步代码块的锁是任意锁,所以定义在可以代表任意对象的Object类中。