进程和线程的区别
进程和线程的由来
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,调度器可以接受,可以忽略,但是不会让出占用的锁
如何中断线程