问题一:进程与线程的区别?什么是进程?什么是线程?
进程:程序的执行过程。进程持有资源(共享内存,共享文件)和线程。这里的资源就是内存,程序是要从内存中读取数据来运行的,所以每个程序运行时都会被分配内存。使用进程最常见的例子就是我们可以同时打开LOL和QQ。可以在电脑的资源管理器来查看这两个进程,值得注意的是进程是属于操作系统的。
线程:是程序执行流的最小单元。同一个进程中可以有多个线程。线程共享进程的资源。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。比如你在跟别人QQ视频的时候还可以文字聊天。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈个局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
问题二:线程的生命周期有哪些?
1. 创建状态
实例化Thread对象,例如:Thread tt = new Thread() 但没有调用start()方法时的状态
2. 就绪状态
当程序调用start()方法后,此时线程位于就绪状态池中,等待获取CPU的使用权。 线程有资格运行,但调度程序还没有把它选为运行线程时所处的状态。
3. 运行状态
从就绪状态池中被选择为当前执行的线程所处的状态。
4. 阻塞状态
线程依然是活的,但是缺少运行的条件 ,一旦具备了条件,就可以转化为就绪状态(不能直接转为运行状态)。
5. 死亡状态
一个线程的run()方法运行结束,那么该线程完成其使命,他的栈结构将解散,也就是死亡了。但是他任然是一个Thread()对象,任然可以被引用,这一点与其他对象一样,而且被引用的对象也不会被垃圾回收器回收。一旦线程死去,他就永远不能重新启动了,也就是说不能再用start()方法让它运行。
问题三:线程的交互方式是什么?
互斥:比如我所在的实验室就是一个进程,实验室中的每一个同学就是一个线程。实验室有一台打印机(属于进程资源),同学们在使用实验室的公共物品打印机(进程中的共享资源)的时候就会互斥,王同学说:我明天交实训报告,打印机应该我使用。李同学不服:刘老师现在问我要出勤名单,打印机必须我先使用。打印机在使用的时候只能一个一个来,一个同学在使用,那么其他人必须等待。这就是互斥。
同步:比如实验室每两周要卫生大扫除,实验室所有同学必须配合起来,齐心合力才能完成大扫除任务。这就是同步。
问题四:线程类Thread常用的方法