面试题:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次
不解释直接上代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReenTantlockTest {
static Lock locks = new ReentrantLock();
static Condition conditonMain = locks.newCondition();
static Condition conditonSun = locks.newCondition();
public static void main(String[] args) {
final ExecutorService executorService = Executors.newFixedThreadPool(100);
for(int bb = 0; bb < 10 ; bb++){
executorService.execute(new Runnable() {
@Override
public void run() {
try {
locks.lock();
for(int i=0 ; i<10 ; i++){
String name = Thread.currentThread().getName();
System.err.println("子线程循环:"+name+"-----"+i);
}
conditonMain.signal();
conditonSun.await();
} catch (Exception e) {
e.printStackTrace();
}finally{
locks.unlock();
}
}
});
try {
locks.lock();
conditonSun.signal();
conditonMain.await();
for(int i = 0 ; i< 100 ; i++){
String name = Thread.currentThread().getName();
System.err.println("主线程循环:"+name+"-----"+i);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
locks.unlock();
}
}
}
}
注:locks-->定义显示锁,比synchronized内置锁更灵活
condition-->定义锁(显示锁)的条件队列,当在线程中调用其await()方法时就会将其存放到锁的条件队列中,比内置锁的强点是可以对一个锁定义多个条件队列。signal()方法唤醒队列中进程(虚假环境),FIFO顺序唤醒。