1.Java线程有优先级 :1~10
static int MAX_PRIORITY:线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY:线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY:分配给线程的默认优先级,取值为5。
使用: 主线程优先级为normal;优先级有继承关系,A线程中创建B线程,那么A,B同样优先级
Thread4 t1 = new Thread4("t1");
t1.setPriority(Thread.MAX_PRIORITY);//这里设置具体数值也是可以的 getPriority可以获取线程优先级
1.1线程睡眠 不释放锁
sleep():使线程转为阻塞状态,当sleep结束后,转为就绪
1.2线程等待object中的方法 释放锁
wait():当前线程等待,释放锁,直到其他线程调用此对象的notify()方法或notifyAll()唤醒方法,行为等价于wait(0)
1.3线程让步 不释放锁
yield():暂停当前正在执行的对象,把执行机会让给相同或者更高优先级的线程
1.4线程加入
join() :当前线程调用另一个线程的jion()方法,当前线程进入阻塞状态,直到另一个进程运行结束,当前才阻塞—>就绪
1.5线程唤醒
notify()与notifyAll() 一个是唤醒一个等待的线程,一个是全部线程唤醒。
https://blog.csdn.net/eff666/article/details/53559201
2.join() :等待该线程终止
主线程启动子线程,子线程用了join方法,则join()方法后的代码需等子线程执行完才会结束回主线程执行
不加join,主线程开始-->主线程结束-->子线程开始-->子线程结束
加join,主线程先开始-->子线程开始-->子线程结束→主线程结束
3.yield() 停止当前正在执行的线程对象,让步相同优先级其他线程,从运行状态→可运行状态(可能没有效果)
4.sleep()当前线程进入停滞,这段时间未释放锁,yield()让给同优先级其他线程执行,yield()被称为“退让”
sleep()之后,低优先级线程可获取运行机会,yield()只让同优先级
5.interrupt()中断某个线程,一般设boolean变量来控制run方法什么时候结束,然后让线程调用interrupt()
isAlive():判断一个线程是否存活
activeCount():程序中活跃的线程数
currentThread():得到当前线程
isDaemon():一个线程是否为守护线程 守护线程必须在线程启动前调用setDaemon(true)方法 守护线程就是后台通用服务线程
线程是有继承性的,守护线程创建的线程也是守护线程(后台线程) setDeamon会出现不执行finally的情况
synchronized用法:
- 当做方法修饰符 :同步方法,锁定的为调用这个同步方法的对象
- synchronized(this):与第一个相同,this代表调用这个方法的对象
- 同步块:
- synchronized作用于static:当前调用这个方法的对象所属的类获得锁
线程传递方式:
- 线程的运行和结束是不可确定的,因此,传递和返回数据无法像方法 一样通过方法参数和return语句返回数据
- 通过构造方法传递数据
- 通过setName()和变量等来传递数据
- 通过方法回调传递数据
继承Thread 实现多线程
实现Runnable接口 实现多线程
ReenTrantLock:允许尝试获取锁但最终未获取锁,这样如果其他线程获取了锁,自己就去做别的事,而不是仅仅是等待
原子性可替换同步
volatile:确保了应用的可视性,如果将一个域声明为volatile,那么只要对这个域产生了写操作,那么所有的读操作都可以看到这个修改(volatile域会被立即写入到主存中,而读操作就发生在主存中)
多个任务在同时访问某个域,那么这个域就应该是volatile,否则这个域就应该只能经由同步来访问。同步也会导致向主存中刷新,因此,若一个域完全由synchronized方法或语句块来防护,则不必将其设置为volatile
原子性:
通过使用AtomicInteger消除synchronized关键字
临界区:::synchronized(syncObject){} :防止多个线程同时访问方法内部的部分代码而不是访问整个方法 syncObject为获得该锁的对象,只有获得锁了才能进入同步控制块
使用缓存锁定的方式实现原子性,
java通过锁和循环CAS的方式来实现原子操作
原子操作常用方法:
- int addAndGet(int delta): 以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果
- boolean compareAndSet(int expect,int update):如果输入的值等于预期值,则以原子方式将该值设置为输入的值
- int getAndIncrement():以原子方式将当前值加一(返回的值为自增前的值)
- void lazySet(int newValue):最终会设置为newValue,使用lazySet()后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值
- int getAndSet(int newValue):以原子方式设置为newValue的值,并返回旧值
原子更新数组:
- int addAndGet(int i,int delta):以原子方式将输入值与数组中索引i的元素相加
- boolean compareAndSet:如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成update值
数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时,不会影响传入的数组
ReentrantLock类
和synchronized关键字一样,线程间执行的顺序是随机的,一旦持有锁,则需释放锁,其他的线程才能获得
Lock
- int getHoldCount() 作用为查询当前线程保持此锁定的个数,也就是调用lock方法的次数
- int getQueueLength() 返回正等待获取此锁定的线程估个数
- int getWaitQueueLength(Condition condition) 返回等待与此锁相关的给定条件Condition的线程估计数,如5个线程,每个线程都执行了同一个condition对象的await()方法,则调用getWaitQueueLength()方法时返回的int值为5
- boolean hasQueuedThreads(Thread thread) 查询是否有线程正在等待获取此锁定
- boolean hasWaiters(Candition condition) 查询是否有线程正在等待与此锁有关的condition条件