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

十一、线程状态总结

stateDiagram state "【新建】Thread t = new Thread()" as 新建 state "【可运行】runable" as 可运行 state "【运行】obtain my timeslice, running" as 运行 state "【死亡】dead thread doesn't start once" as 死亡 state "【阻塞】doesn't release any lock or monitor" as 阻塞 state "【锁池】lock pool" as 锁池 state "【等待队列】release lock or monitor" as 等待队列 note left of 新建 线程状态图 end note 新建 --> 可运行: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()
posted @ 2022-03-16 18:00  一颗米  阅读(164)  评论(0)    收藏  举报