多线程学习-LockSuppor
用来创建锁和其他同步类的基本线程阻塞原语,如果该许可可用,并且可在进程中使用,则调用 park 将立即返回;否则可能 阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。
API:
方法 | 作用 |
---|---|
park() | 为了线程调度,禁用当前线程,除非许可可用。 |
unpark(Thread thread) | 如果给定线程的许可尚不可用,则使其可用。 |
案例:
启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20…以此类推, 直到打印到75. 程序的输出结果应该为:
static Thread threadOne,threadTwo,threadThree;
static int count=0;
public static void main(String[] args) {
int end=75;
threadOne=new Thread(()->{
while(AplicationLoader.count<75) {
for(int i=1;i<=5;i++) {
AplicationLoader.count++;
System.out.println(threadOne.getName()+":"+AplicationLoader.count);
}
LockSupport.unpark(threadTwo);
LockSupport.park();
}
},"线程1") ;
threadTwo=new Thread(()->{
while(AplicationLoader.count<75) {
LockSupport.park();
for(int i=1;i<=5;i++) {
AplicationLoader.count++;
System.out.println(threadTwo.getName()+":"+AplicationLoader.count);
}
LockSupport.unpark(threadThree);
}
},"线程2") ;
threadThree=new Thread(()->{
while(AplicationLoader.count<75) {
LockSupport.park();
for(int i=1;i<=5;i++) {
AplicationLoader.count++;
System.out.println(threadThree.getName()+":"+AplicationLoader.count);
}
LockSupport.unpark(threadOne);
}
},"线程3") ;
threadOne.start();
threadTwo.start();
threadThree.start();
}