Thread一些基本概念
1、实现线程的三种方式 (extends Thread , Implements runnable , implements Callable new FutureTask(Callable) new Thread(futuretask))
2、线程让步yield(让线程由运行状态变为就绪状态,不会释放锁)
3、线程休眠sleep(让线程由运行状态到阻塞状态,当休眠时间到了以后由阻塞状态变为就绪状态等待cpu调用,不会释放锁)
4、join 阻塞当前线程, 待加入的线程执行完后再执行
main线程 执行如下
thread a = new thread();
a.start();
a.join();
System.out...("主线程执行完毕");
流程分析如下:主线程启动a线程, a线程异步运行, 主线程接着往下走, 将a线程join后, 主线程进入阻塞状态, 等待a线程运行完毕后, 主线程才接着运行。
注:(主线程阻塞时候,并不会释放锁,如果主线程获得锁,之后让子线程先执行,此时子线程也需要获得锁的话,就会造成死锁)。
5、线程优先级 1~10 默认为5 , 越大优先级别越高。
6、线程守护setDaemon(true); 当线程设置它的时候说明该线程就是守护线程, 当主线程执行完毕后, 守护线程自动中断。 它的生命周期伴随着主线程。
7、interrupt 线程的终止
8、wait 和notify notifyAll 线程的等待和唤醒。
执行wait时候线程释放锁立即阻塞 ,执行notify的时候线程释放锁, 但是不会立即阻塞而是执行完当前函数。(可用作生产和消费)
9、脏读概念
业务整体时,保证整块业务的原子性。意思就是说相关业务整体需要使用完整的锁。
例如 一个对象 有名字 和 年龄 两个属性
当我们设置的时候,需要给名字和属性都设上值,此时才是一块完整的业务。如果
只给其中的一个设置了,此时另一个线程就读了,那么结果肯定是2个属性中一个属性有值, 一个属性没值, 此时就属于脏读问题。 不完整性。
10、synchronized 锁
锁对象、锁类、锁代码块。
父类的某个函数被synchronized 修饰的话, 子类重写该方法的话, 如果子类不再加synchronized的话, 子类不具有锁 , 如果子类不重写该方法的话,那么子类继承父类的时候,也继承了synchronized锁。
11、volatile 此关键字保存线程间的可见性。
当两个线程调用公有的成员变量的时候, jdk1.5以后做了优化, 他会把成员变量复制一个副本到线程栈中, 执行的时候,直接调用的是线程栈中的变量。
volatile 不能保证原子性。