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,线程正常运行,不受影响。

十一、线程状态总结

t.start()

OS选中

1、时间片用完 2、Thread().yield()

1、I/O操作等待用户输入 2、Thread.sleep()

1、I/O操作用户输入完成 2、sleep()时间结束

1、run()、main()结束 2、异常退出

lock.wait()

synchronized(lock)

拿到锁标识

被其他线程唤醒:lock.notify()或lock.notifyAll()

【新建】Thread t = new Thread()

【可运行】runable

【运行】obtain my timeslice, running

【死亡】dead thread doesn't start once

【阻塞】doesn't release any lock or monitor

【锁池】lock pool

【等待队列】release lock or monitor

线程状态图

posted @   一颗米  阅读(143)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示