什么是进程?
比如电脑上一个程序就是一个进程
什么是线程?
比如LOL游戏,一个界面上同时有多个英雄,当我们看到的时候是同时运动的,其实是因为cpu的运行速度远大于我们眼睛所看到的速度,以为是同时运行的。
进程与线程的关系?
一个进程至少有一个线程
当什么时候用到多线程?
当我们需要同时执行多个任务的时候,就需要多线程。
当我们需要快速完成一个任务的时候,需要用到多线程。
什么是并发?
线程调度分配时间片段给不同的线程,得到时间片段的线程由cpu调用执行,其他的线程需要等待执行任务的线程执行任务,线程调度会尽可能的平均分配时间片段给不同的线程。
线程的生命周期?
线程与进程
新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
创建线程的方式?
①:继承thread类,重写run()方法。
有先后顺序执行顺序的叫同步线程;没有先后顺序的叫异步线程。
start()方法是将线程加入线程调度里面,并不是说立马就执行。如果是调run()方法是说明立马就执行就不是异步线程了。
在线程的run()方法执行期间,线程是处于走走停停的状态。
start()方法是将线程加入线程调度中,这时线程进入runnable状态,等待线程调度分配时间片。当时间片分配给当前线程的时候,线程才开始去执行run()方法,之所以run期间会走走停停是因为线程调度分配的时间片段的时间有限,从而实现了并发。run()方法执行结束之后,进入dead状态,也就是被系统回收。
异步,就是各干各的,不要去想谁先谁后,如果考虑到了谁先谁后那就是同步线程了而不是异步线程了。
②:使用匿名内部类的形式创建线程
Thread t=new Thread(){
public void run(){}
};
匿名内部类必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的引用。当然这个引用是隐式的。
额外:
os是操作系统的意思