偶然看到一道面试题:
*/子线程循环 10 次,接着主线程循环 100 ,接着又回到子线程循环 10 次
接着再回到主线程又循环 100 ,如此循环 50 次,请写出程序。/*
刚好最近在学习并发知识就尝试去做了下。代码如下:(标红处为不明白的地方,希望能指导!)
public class Service extends Thread {
static volatile boolean flag = true;
// volatile 保证可见性
static volatile int isOver_vice = 0;
static volatile int isOver_main = 0;
static Lock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
Service service = new Service();
service.start();
test();
System.out.println("<<<<<<<<<<<over>>>>>>>>>");
}
public static void test() throws InterruptedException {
boolean k1 = true;
while (k1) {
if (isOver_main >= 10) {
k1 = false;
break;
}
//☆这里如果不停下 最后一次的输出结果会不正确 暂时不明白 请各位分析告知
Thread.sleep(500);
if (!flag && lock.tryLock()) {
isOver_main++;
for (int i = 0; i < 100; i++) {
System.out.print("???" + i + "?;");
}
System.out.println();
System.out.println("====" + isOver_main);
flag = !flag;
lock.unlock();
}
}
System.out.println("???????" + isOver_main);
}
@Override
public void run() {
boolean k1 = true;
while (k1) {
if (isOver_vice >= 10) {
k1 = false;
break;
}
if (flag && lock.tryLock()) {
//lock.lock();
isOver_vice++;
for (int j = 0; j < 10; j++) {
System.out.print("???" + j + "?;");
}
System.out.println();
flag = !flag;
lock.unlock();
}
}
System.out.println("???????" + isOver_vice);
}
}