记录一下基础概念
并行:多个进程一起执行,比如说两队人在两个窗口打饭(想到了大学生活)
并发:并发和时间有关,脱离时间谈并发是不靠谱的。在单位时间内,多个线程一起执行,抢占cpu资源。比如说坐公交,以前都是你抢我夺,提前上车抢位置(现在好多了)
Thread的创建方式只有两种,一种extend Thread ,另一种 implements Runnable;如下图所示,Thread源码中有说明
Thread在run写业务逻辑,通过调用start方法跟jdk中的线程挂钩,真正去执行一个线程
Thread的状态分为几步:1、创建 2、就绪 3、运行/阻塞 4、死亡
通过调用start方法,Thread进入就绪状态,等分配到了cpu资源,获得了执行权就进入了运行状态。调用Thread的yield方法,Thread会让出cpu,重新回到就绪状态。等Thread执行完成就进入了死亡状态,或者将Thread设置成守护线程,等其他线程执行完,守护线程自动进入死亡状态。我们常说的gc(垃圾回收机智),就是守护线程。守护线程建议不要在finally中写资源释放的代码,因为很可能不会执行。
阻塞状态是调用了sleep或者wait后就进入了阻塞状态,要取消就等sleep的时间过去
中断是在外部调用Thread的interrupt方法,在内部通过while(!isInterrupted())进行判断中断线程,并不是直接中断。
isInterrupted和Thread.interrupted的区别在于,一个是普通方法,调用后不会改变interrupt的值;另一个是静态方法,调用后会修改interrupt的值,将其由true改为false
另外Thread的join方法可以获取cpu执行权,通俗的说法就是插队,比方说在b线程中调用a.join(),则a线程一定在b线程之前执行。如果要排队执行线程,可以通过这种方法。
setPriority(int)可以设置线程的优先级,优先级高的获得执行权的机率大于优先级低的
多个线程共享一个进程资源的时候,会涉及安全的问题,需要加锁。锁分为类锁以及对象锁,类锁是在static方法上加synchronized关键字,除此之外的所有加synchronized的地方都是对象锁。类锁其实也是对象锁,它锁的是class对象,所有叫类锁,其他的锁的是当前的引用对像