LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。
LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。
LockSupportTest:
结果:
LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。
函数列表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。
static
Object getBlocker(Thread t)
// 为了线程调度,禁用当前线程,除非许可可用。
static
void
park()
// 为了线程调度,在许可可用之前禁用当前线程。
static
void
park(Object blocker)
// 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。
static
void
parkNanos(
long
nanos)
// 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。
static
void
parkNanos(Object blocker,
long
nanos)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static
void
parkUntil(
long
deadline)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static
void
parkUntil(Object blocker,
long
deadline)
// 如果给定线程的许可尚不可用,则使其可用。
static
void
unpark(Thread thread)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package
org.credo.jdk.thread.locksupport;
import
java.util.concurrent.locks.LockSupport;
public
class
LockSupportTestB
{
private
static
Thread mainThread;
public
static
void
main(String[] args)
{
LockSupportTestBTest test =
new
LockSupportTestBTest(
"current"
);
mainThread = Thread.currentThread();
System.out.println(Thread.currentThread().getName() +
" start ta"
);
test.start();
System.out.println(Thread.currentThread().getName() +
" block"
);
LockSupport.park(mainThread);
System.out.println(Thread.currentThread().getName() +
" continue"
);
}
static
class
LockSupportTestBTest
extends
Thread
{
public
LockSupportTestBTest(String name)
{
super
(name);
}
@Override
public
void
run()
{
System.out.println(Thread.currentThread().getName() +
" wakup others"
);
// 唤醒“主线程”
LockSupport.unpark(mainThread);
}
}
}
|
main start ta
main block
current wakup others
main continue