Java进程和线程
Java进程和线程
任务A执行I/O操作时,去执行任务B。
进程独占内存空间,线程共享进程的内存资源。
一、区别
进程时资源分配的最小单位,线程时CPU调度的最小单位
1、线程属于某个进程,共享其资源
2、线程只有堆栈寄存器、程序计数器和线程控制表(TCB)组成---线程的抢占 CAS自旋 JMM 结合思考
二、总结
每一个Java进程对应一个JVM实例,多个线程共享JVM的堆
Java是单线程编程模型,程序只会创建一个主线程,UI编程时耗时操作放在子线程中
一个程序是一个可执行的文件,一个进程是一个执行实例
JVM是多线程的,它有例如GC线程等等线程
三、线程的start和run方法的区别
调用start()会创建一个新的子线程并启动run();
run()只是一个Thread的普通方法调用,在主线程中调用即主线程为调用者。
四、Thread和Runnable的关系
Thread实现了Runnable接口,使得run方法支持多线程
由于Java是单一集成原则,推荐使用Runnable接口
五、如何处理线程的返回值
1、如何给run()传参
构造函数传参、成员变量传参、回调函数传参
2、如何实现处理线程的返回值
一、主线程等待法
二、使用Thread类的join()阻塞当前线程以等待子线程处理完毕
三、通过Callable接口实现:通过FutureTask Or 线程池获取
FutureTask配套使用isDone()和get()方法;
或者可行的ExecutorService.submit(Callable),提一下不可行的Executor.execute(Runnable)。
六、线程的状态
六个状态
1、new,创建后尚未启动(start)
2、runnable,包含操作系统中的Ready->Running两种状态
3、waiting(无限期),不会被分配CPU执行时间,需要显示唤醒
new Object.wait()&&Thread.join()未设置Timeout参数||LockSupport.park()
4、timed waiting(限期等待),一定时间后系统自定唤醒
Thread.sleep()||new Object.wait()&&Thread.join()设置Timeout参数||LockSupport.parkNanos()||LockSupport.parkUntil()
5、blocked(阻塞),等待获取排它锁
6、Terminated,已终止线程状态,线程已经结束执行
七、sleep和wait的区别
1、Thread.sleep(),new Object.wait()两者所属不同
2、Thread.sleep()可以在任何位置使用
3、new Object.wait()只能在synchronized方法或者synchronized块中使用
4、new Object.wait()让出CPU并释放锁,Thread.sleep()只会让出CPU不会释放锁
八、notify和notifyAll的区别
1、锁池和等待池
锁池:线程A调用的某个对象被上锁,其他线程同样想取到锁住的代码时,这些线程会进入锁池
等待池:线程A调用某个对象的wait()方法,线程A就会释放该对象的锁,线程A进入等待池,并不去竞争对象的锁
2、区别
notifyAll()所有处于等待池中的线程全部进入锁池去竞争获取锁的机会
notify()只会随机选取一个处于等待池中线程进入锁池去竞争获取锁的机会
九、yield()
1、当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU的暗示,但调度器可能会忽略这个暗示。
2、对锁的行为不会有影响
十、interrupt()
通知线程应该中断
1、如果线程处于被阻塞状态(不仅限于blocked),线程立即退出阻塞状态,并抛出InterruptException异常。
2、如果线程处于正常活动状态,线程中断标志设为true,线程正常运行,不受影响。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通