Java进程和线程详解(手把手教学)

进程和线程的区别

进程和线程的由来
在这里插入图片描述在这里插入图片描述

Java进程和线程的关系

在这里插入图片描述我们的一个Java应用程序,启动类启动后。这个应用程序就是一个进程,他会开启一个主线程进行程序的执行,并不知启动一个主线程,其实还有GC线程等很多线程都在运行。

一个进程就是一个JVM,不同的线程在这个进程内运行,各自具有栈、程序计数器、本地方法区,多个线程共享堆空间,1.7版本方法区(包含静态常量池),1.8时元空间直接放在内存上了

线程的RUN和START方法

run方法是当前主线程通过执行一个方法,执行结束就结束了,
start方法是真正开启一个线程,线程去执行run方法

上图!
JDK源码查看地址-官网
在这里插入图片描述

Tread、Runnable区别

Thread是实现了Runnable接口的一个类,使得run支持多线程,多数情况我们会实现Runnable接口,因为Java是单继承原则,这样的累我们可以继续拓展

如何给run方法传参

构造函数传参
成员变量传参
回调函数传参

如何实现处理线程的返回值

主线程等待法

在这里插入图片描述这样是不能保证value一定有值的,需要再写个while一直查询数据是否有值,有值才进行继续的执行,值多了,这样就显得很蠢!

使用Join方法阻塞当前线程等待有值

在这里插入图片描述粒度不够细啊,假如我现在有三个线程,我想让A处理到第五次,让B处理一会儿,就没法整?就TM离谱??

使用Callable接口实现:通过FutureTask Or线程池获取

我们写一个类实现Callable接口,这个接口的实现类,可以被放进FutureTask中进行执行,FutureTask实现了FutureRunnable实现了Runable,所以创建的Task对象是可以放进一个Thread对象中实例化执行start方法的
在这里插入图片描述
我们开启运行一下,在执行task.get()方法,当前线程会等待线程执行结束以后,继续执行之后的代码
在这里插入图片描述
我们可以使用线程池,也可以实现这样的一个操作
在这里插入图片描述

线程的状态

六个状态

在这里插入图片描述在这里插入图片描述在这里插入图片描述

wait和sleep的区别

在这里插入图片描述最本质的区别
Thead.sleep只会让出CPU,不会让出锁行为
Object.wait会让出CPU、锁

整个栗子🌰!
在这里插入图片描述执行结果如下
在这里插入图片描述
线程A在sleep过程中,B其实已经在运行了,但是显然B并未获取到locks的资源,只有在A执行到locks.wait()方法时,资源被释放

使用notify唤醒程序,醒醒吧,工头叫你搬砖了!
在这里插入图片描述
我们可以看到执行结果是一致滴~

notify和notifyAll

首先理解两个概念

  • 锁池
    在这里插入图片描述
  • 等待池
    在这里插入图片描述
    以我们上一主题中的栗子🌰来说
    线程A拿到锁,B被block就进入锁池了
    A里locks.wait调用,A释放锁进入等待池,不参与竞争资源,等待被通知

在这里插入图片描述

yield

暗示调度器,可以让出cpu,调度器可以接受,可以忽略,但是不会让出占用的锁
在这里插入图片描述

如何中断线程

在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值