2018-09-03 java多线程

image.png

1.extends Thread类
定义:
Thread thread=new myThread();
thread.setName("Thread1");
thread.setName("线程1");
thread.start();
run()中可以使用getName()获取线程名

2.implements Runnable类
MyThread myThread=new MyThread();
Thread thread=new Thread(myThread);
thread.setName("线程2");
thread.start();
run中可以用Thread.currentThread().getName()获取线程名

3.sleep()、join()、yield()
sleep():睡眠指定时间,之后再次启动
join():让其他线程等待当前线程执行完成后再执行
yield():让出cpu给其他线程,再次选择的线程随机,可能选回自己

4.wait() 与 notify()/notifyAll()
需要定义一个 privide final Object lockObj=new Object();
对于synchronized(lockObj)中
wait() :此线程让出线程并进入wait set区
notify()/notifyAll():从wait set释放1个/多个线程,重新竞争线程

wait() 与 notify()/notifyAll()不会同时执行

5.退出线程
不建议使用stop(),因为可能停在代码的任意步骤,造成程序执行不完整
建议定义一个boolean,放在while循环中判断
volatile boolean keeprunning =true;

6.其他
synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以

synchronized修饰的静态方法锁定的是这个类的所有对象

给class加锁和上例的给静态方法加锁是一样的,所有对象公用一把锁

线程1访问synchronized方式时,线程2可以访问非synchronized方法,包括静态方法

synchronized(this):
等同于在方法中加synchronized
synchronized(lockObj):
当多个线程访问同一个类 A 的方法 A() 的时候。并且,这个方法 A() ,要求一个线程执行完了之后再给另外一个线程去执行。那么,这个方法 A() 就必须加上 synchronized 关键字,或者,在该方法 A() 中写上
synchronized(this//指代当前类A的实例) { }
如果不在声明方法 A() 时,加上 synchronized 关键字,或者,不在方法 A() 中加上 synchronized(this){ }
同步块的时候可以在线程类的 run() 方法内
synchronized(Object //指代类A的实例){
Object.A();
}
实现多线程同时有序访问该同步块内类 A 的方法 A() 的目的。


线程池:
cachedThreadPool.execute(new Runnable())
不手动new线程,而是使用cachedThreadPool管理线程

https://blog.csdn.net/sayoko06/article/details/79579639
https://blog.csdn.net/japson_iot/article/details/80465432
https://www.jianshu.com/p/210eab345423
https://blog.csdn.net/mine_song/article/details/70948223


死锁
https://blog.csdn.net/m0_38126177/article/details/78587845

你可能感兴趣的:(2018-09-03 java多线程)