线程生命周期状态
线程池中的线程为什么可以复用?
线程池 其实就是管理线程的容器。
一句话解释:
就是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() {
// 奇数线程
@Override
public 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() {
@Override
public 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