进程独占内存空间,保存各自运行状态,相互间不干扰且可以相互切换,为并发处理任务提供了可能
线程共享进程的内存资源,相互切换更快速,支持更细粒度的任务控制,使进程内的子任务得以并发执行
进程是资源分配的最小单位,线程是cpu调度的最小单位
所有与进程相关的资源都被记录在PCB中
进程是抢占处理机的调度单位;线程属于某个进程,共享其资源
线程只由堆栈寄存器、程序计数器和TCB组成
start和run的区别
线程中start方法,会创建一个新的线程然后调用线程中的run方法
直接调用run方法,则只会执行run方法,而不创建新的线程
Thread和Runnable的区别
Thread 是一个类,Runnable是一个接口
可以继承Thread,派生一个类,然后调用start方法
可以实现Runnable接口,生成类,将此类传入Thread,调用Thread对象的start方法
建议使用实现Runnable方法,创建多线程
如何实现处理线程的返回值
主线程等待法:在主函数中添加while语句,只要线程返回值不为空,则继续等待,调用sleep方法
使用Thread类的join方法阻塞当前线程以等待子线程处理完毕;
通过Callable接口实现:通过FutureTask Or 线程池获取
通过FutureTask 获取:
实现一个Callable接口的call方法,返回值
生成一个FutureTask对象,传入callable的对象
将FutureTask对象传入线程Thread,启动
调用isDone来判断线程是否结束,利用get获取返回值
线程池
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
Future<String> future= newCachedThreadPool.submit(new MyCallable());
if(!future.isDone()){
System.out.println("wait");
}
try {
System.out.println(future.get());
}
catch (Exception e){
}
finally {
newCachedThreadPool.shutdown();
}
线程池的好处,能够实现多个callable类,并发处理
线程的状态:有6个
- New(新建):创建后尚未启动的线程的状态
- Runnable(运行):包含Running和Ready
- Waiting(无限期等待):不会被分配cup执行时间,需要显示被唤醒
- Timed Waiting(限期等待):在一定时间后会由系统自动唤醒
- Blocked(阻塞):等待获取排他锁
- 结束(Terminated):已终止线程的状态,线程已经结束执行
sleep方法和wait的方法
基本差别:
- sleep是Thread类的方法,wait是Object类中定义的方法
- sleep方法可以在任何地方使用
- wait只能在synchronized方法或者synchronized块中使用,因为获取锁了,才能释放锁
wait能够让出cpu,释放锁,slepp不能释放锁
notify和notifyAll的区别
每个对象都有所锁池(EntryList)和等待池(WaitSet)
notifyAll会让所有处于等待池中的线程全部进入锁池去竞争获取锁的机会
notify只会随机选取一个