进程和线程的概念:
答案:进程就是一个程序运行起来的状态,线程是一个进程中的不同的执行路径。
专业:进程是OS分配资源的基本单位,线程是执行调度的基本单位。
启动线程的两种方法:
new Thread().start() >>> static class MyThread extends Thread{}
new Thread(Runnable).start >>> static class MyRun implements Runnable{}
Sleep:睡眠,当前线程暂停一段时间让给别的线程去运行
Yield:当前线程正在执行的时候停止下来进入等待队列,回到等待队列里,在系统的调度算法里头还是有可能把刚才的线程拿回来继续执行
Join:在自己当前线程加入你调用Join的线程,t2.join 加入t2线程
线程状态:
当我们new一个线程时,还没有调用start(),该线程处于新建状态;
当线程对象调用start()方法时候,他会被线程调度器来执行,这整个状态叫作Runable,Runable内部有两个状态(1)Ready就绪状态(2)Running运行状态 ;
就绪状态是说线程放在CPU的等待队列里面去排队等待CPU运行,等待真正放在CPU上去运行的时候才叫Running运行状态;
如果线程执行完了,就会进入Teminated结束状态;
在Runnable这个状态里头还有其他一些状态的变迁TimedWaiting等待、Waiting等待、Blocked阻塞;
synchronized:多线程去访问同一个资源的时候,一般需要对这个资源上锁
private object o = new Object(); synchronized(o)
synchronized(this)锁定当前对象
静态方法:synchronized代表synchronized(T.class)锁的是T类的对象
synchronized即保证了原子性,有保证了可见性;
synchronized另一个属性:可重入,就是你拿到这把锁之后不停地加锁,但锁定的是同一个对象。
异常锁:程序在执行过程中,如果出现异常,默认情况锁就会被释放
偏向锁:记录线程ID
自旋锁:如果线程争用,就升级为自旋锁
重量级锁:10次
执行时间短,线程数少,用自旋
执行时间长,线程数多,用系统锁