线程生命周期状态
线程池中的线程为什么可以复用?
线程池 其实就是管理线程的容器。
一句话解释:
就是run方法没有执行完,而是在run方法里面设置一个循环。线程没有被使用的时候处于阻塞暂停状态,需要使用的时候阻塞打开,执行任务,任务完成之后,再循环回来,再次阻塞暂停。此时仍在循环当中。所以run方法一直也没有结束,因此可以重复使用多次。
Threadlocal使用案例


2个线程交替打印奇偶数
package test2005;public class test {private static volatile Integer counter = 0;private static Object monitor = new Object();public static void main(String[] args) {new Thread(new Runnable() {// 奇数线程@Overridepublic void run() {while (true){synchronized (monitor){if (counter % 2 != 0){continue;}int i = ++counter;if (i > 100){return;}System.out.println("奇数线程:" + i);try {monitor.notify();monitor.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true){synchronized (monitor){if (counter % 2 == 0){continue;}int i = ++counter;if (i > 100){return;}System.out.println("偶数线程:" + i);try {monitor.notify();monitor.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();}}
1.wait
wait(),当前线程进入 无限等待状态,必须被唤醒才能继续执行,调用后会释放锁对象
wait(long timeout),wait(long timeout,int nanos),当前线程进入等待状态,可以被提前唤醒,但在指定时间后会自动唤醒
2.notify
notify(), 随机唤醒一个在锁对象上调用wait的线程
notifyAll(),唤醒 全部在锁对象上调用wait的线程
————————————————
版权声明:本文为CSDN博主「omelete」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31075041/article/details/106931481

