1. Java实现多线程的两种方法:
继承Thread类(Java单继承);实现Runnable接口;
2. 线程安全:synchronized关键字
3. 常用方法:
currentThread()/isAlive()/sleep()/getId()
4. 停止线程3种方法:
(1) run方法完成后线程正常退出
(2) 使用stop方法强制终止线程(过期作废的方法,不推荐,可能使一些清理性的工作得不到完成,另一个情况是对锁定的对象进行了解锁,导致数据得不到同步的处理)
(3) 使用interrupt()方法(可以与return结合使用)
5. 判断线程是否为中断:
(1) this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。
(2) this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志
6. 暂停(suspend)和恢复(resume)线程:
7. yield方法:
放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
8. 线程优先级:
setPriority(int x)方法,参数x为1-10,不在此范围会thrownew illegalArgumentException()
JDK预置常量:MIN_PRIORITY=1,NORM_PRIORITY=5,MAX_PRIORITY=10
9. 线程优先级的继承特性:
在Java中,比如A线程启动B线程,则B线程的优先级与A是一样的。
10. 守护线程Daemon:
在Java线程中有两种线程,一种是用户线程,另一种是守护线程。
典型的守护线程是垃圾回收线程
setDaemon(boolean true)
11. synchronized同步方法:
(1)关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,所以哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能等待,前提是多个线程访问的是同一个对象。
(2). A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法;A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法则需要等待,也就是同步。
(3)synchronized锁重入:在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的;当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的。
(4)当一个线程执行的代码出现异常时,其所持有的锁会自动释放。
(5)同步不具有继承性
(6)synchronized同步语句块(相比直接使用synchronized声明方法,同步语句块有时更高效)
synchronized(this){}
(7)一半异步,一半同步:不在synchronized块中就是异步执行,在synchronized块中就是同步执行。
(8)当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中所有其他synchronized(this)同步代码块的访问将阻塞,这说明synchronized使用的“对象监视器”是一个。
(9)使用“synchronized(非this对象x)同步代码块”格式进行同步操作时,对象监视器必须是同一个对象。如果不是同一个对象监视器,运行的结果就是异步调用了,就会交叉运行。