进程和线程的区别
线程不能看作独立应用,进程可以看做独立应用
进程有独立的地址空间,相互不影响,线程是进程的不同执行路径
线程没有独立的地址空间,多进程的程序比多线程程序健壮
进程的切换比线程的切换开销更大
Java对操作系统提供的功能进行封装,包括进程和线程
运行一个程序会产生一个进程,进程至少包含一个线程
每一个进程对应一个JVM实例,多个线程共享JVM里的堆,每个线程有自己独立的虚拟机栈,一个线程不能访问或干扰另一个线程的栈。这保证了线程的局部变量是隔离的
Java采用单线程编程模型,程序会自动创建主线程
主线程可以创建子线程,原则上要后于子线程完成执行
Thread的run和start
start底层调用start0方法,是一个native方法,底层在c++调用了一个newThread的方法,创建新的子线程进行调用run方法中的内容
run方法还是在主线程中调用
run 就是个普普通通的方法而已,而 start 这个方法才会调用相关的 函数去创建一个子线程去执行run方法中的内容
Thread和runnable区别
Thread是实现了runnable接口的类,使得run支持多线程
Thread t = new Thread();
t.start();
Thread t = new thread(new Runnable(){//重写run方法});
t.start();
如何实现处理线程的返回值
- 主线程等待
- 使用Thread类的join方法阻塞当前线程以等待子线程执行完毕
- 使用callable接口实现:通过Futuretask或者线程池获取
线程的状态
Sleep和wait
notify和notifyAll
锁池:
等待池:
yield
如何中断线程