多线程—学习笔记

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)同步代码块”格式进行同步操作时,对象监视器必须是同一个对象。如果不是同一个对象监视器,运行的结果就是异步调用了,就会交叉运行。

猜你喜欢

转载自blog.csdn.net/u013178480/article/details/79862435