导航
两个线程交替运行的问题题目解法一:LockSupport解法解法二:LockCondition解法解法三:synchronized-wait-notify解法
两个线程交替运行的问题
题目
有两个数组A“123456”,B“abcdefg”,依次交替输出,例:1a2b3c…
解法一:LockSupport解法
import java
.util
.concurrent
.locks
.LockSupport
;
public class LockSupport_Demo
{
static Thread t1
= null, t2
= null;
public static void main(String
[] args
) {
char
[] num
= "123456".toCharArray();
char
[] eng
= "ABCDEF".toCharArray();
t1
= new Thread(() -> {
for (char c
: num
) {
System
.out
.println(c
);
LockSupport
.unpark(t2
);
LockSupport
.park();
}
});
t2
= new Thread(() -> {
for (char c
: eng
) {
LockSupport
.park();
System
.out
.println(c
);
LockSupport
.unpark(t1
);
}
});
t1
.start();
t2
.start();
}
}
解析:两个线程一起start,jvm并不知道要先运行哪一个,所以在线程t2中一进入就用LockSupport.park()锁定,必然是先运行线程t1;之后执行完后把t2解锁,自己加锁,t2如此往复
运行结果:
解法二:LockCondition解法
import java
.util
.concurrent
.locks
.Condition
;
import java
.util
.concurrent
.locks
.Lock
;
import java
.util
.concurrent
.locks
.ReentrantLock
;
public class LockCondition_Demo
{
public static void main(String
[] args
) {
char
[] num
= "123456".toCharArray();
char
[] eng
= "ABCDEF".toCharArray();
Lock lock
= new ReentrantLock();
Condition conditionT1
= lock
.newCondition();
Condition conditionT2
= lock
.newCondition();
new Thread(() -> {
try {
lock
.lock();
for (char c
: num
) {
System
.out
.println(c
);
conditionT2
.signal();
conditionT1
.await();
}
conditionT2
.signal();
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
finally {
lock
.unlock();
}
}, "t1").start();
new Thread(() -> {
try {
lock
.lock();
for (char c
: eng
) {
System
.out
.println(c
);
conditionT1
.signal();
conditionT2
.await();
}
conditionT1
.signal();
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
finally {
lock
.unlock();
}
}, "t2").start();;
}
}
解法三:synchronized-wait-notify解法
public class Sync_wait_notify
{
public static void main(String
[] args
) {
char
[] num
= "123456".toCharArray();
char
[] eng
= "ABCDEF".toCharArray();
final Object o
= new Object();
new Thread(() -> {
try {
synchronized (o
) {
for (char c
: num
) {
System
.out
.println(c
);
o
.notify();
o
.wait();
}
o
.notify();
}
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
}, "t1").start();
new Thread(() -> {
try {
synchronized (o
) {
for (char c
: eng
) {
System
.out
.println(c
);
o
.notify();
o
.wait();
}
o
.notify();
}
}
catch (InterruptedException e
) {
e
.printStackTrace();
}
}, "t2").start();
;
}
}