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

进程和线程的区别

进程和线程的由来
Java进程和线程详解(手把手教学)_第1张图片Java进程和线程详解(手把手教学)_第2张图片

Java进程和线程的关系

Java进程和线程详解(手把手教学)_第3张图片我们的一个Java应用程序,启动类启动后。这个应用程序就是一个进程,他会开启一个主线程进行程序的执行,并不知启动一个主线程,其实还有GC线程等很多线程都在运行。

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

线程的RUN和START方法

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

上图!
JDK源码查看地址-官网
Java进程和线程详解(手把手教学)_第4张图片

Tread、Runnable区别

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

如何给run方法传参

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

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

主线程等待法

Java进程和线程详解(手把手教学)_第5张图片这样是不能保证value一定有值的,需要再写个while一直查询数据是否有值,有值才进行继续的执行,值多了,这样就显得很蠢!

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

Java进程和线程详解(手把手教学)_第6张图片粒度不够细啊,假如我现在有三个线程,我想让A处理到第五次,让B处理一会儿,就没法整?就TM离谱??

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

我们写一个类实现Callable接口,这个接口的实现类,可以被放进FutureTask中进行执行,FutureTask实现了FutureRunnable实现了Runable,所以创建的Task对象是可以放进一个Thread对象中实例化执行start方法的
Java进程和线程详解(手把手教学)_第7张图片
我们开启运行一下,在执行task.get()方法,当前线程会等待线程执行结束以后,继续执行之后的代码
Java进程和线程详解(手把手教学)_第8张图片
我们可以使用线程池,也可以实现这样的一个操作
Java进程和线程详解(手把手教学)_第9张图片

线程的状态

六个状态

Java进程和线程详解(手把手教学)_第10张图片Java进程和线程详解(手把手教学)_第11张图片在这里插入图片描述

wait和sleep的区别

Java进程和线程详解(手把手教学)_第12张图片最本质的区别
Thead.sleep只会让出CPU,不会让出锁行为
Object.wait会让出CPU、锁

整个栗子!
Java进程和线程详解(手把手教学)_第13张图片执行结果如下
Java进程和线程详解(手把手教学)_第14张图片
线程A在sleep过程中,B其实已经在运行了,但是显然B并未获取到locks的资源,只有在A执行到locks.wait()方法时,资源被释放

使用notify唤醒程序,醒醒吧,工头叫你搬砖了!
Java进程和线程详解(手把手教学)_第15张图片
我们可以看到执行结果是一致滴~

notify和notifyAll

首先理解两个概念

  • 锁池
    Java进程和线程详解(手把手教学)_第16张图片
  • 等待池
    在这里插入图片描述
    以我们上一主题中的栗子来说
    线程A拿到锁,B被block就进入锁池了
    A里locks.wait调用,A释放锁进入等待池,不参与竞争资源,等待被通知

Java进程和线程详解(手把手教学)_第17张图片

yield

暗示调度器,可以让出cpu,调度器可以接受,可以忽略,但是不会让出占用的锁
Java进程和线程详解(手把手教学)_第18张图片

如何中断线程

Java进程和线程详解(手把手教学)_第19张图片
Java进程和线程详解(手把手教学)_第20张图片

你可能感兴趣的:(Java,并发编程)