这个问题的来源是一个题目:线程A循环10次,线程B循环100,接着又回到线程A循环10次,接着再回到线程B又循环100,如此循环50次。
一般来说线程锁可以用:synchronized、Lock。
这个题目的难点不在于同步块,而在于怎么样设计这个两个线程的交替实现。由于线程争用cpu的随机性,就需要A线,B线程执行,在B执行完一次进入等待之前唤醒A,如此往复,那么这里就要用上notify和wait了。
/*
* Copyright (c) 2014 Qunar.com. All Rights Reserved.
*/
/**
* @author: wangh.wang Date: 2015/7/22 Time: 21:15
*/
public class Thread1 {
public static void main(String args[]) {
final Bussiness business = new Bussiness();
Thread a=new Thread(new Runnable(){
@Override
public void run(){
business.SubThread();
}
});
Thread b=new Thread((new Runnable() {
@Override
public void run() {
business.MainThread();
}
}));
a.start();
b.start();
}
}
class Bussiness {
private static Object LOCK = new Object();
volatile boolean bShouldSub = true;//这里相当于定义了控制该谁执行的一个信号灯
public void MainThread() {
for (int i = 0; i < 50; i++) {
synchronized (LOCK) {//notify和wait的对象一定要和synchronized的对象保持一致
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + "+MainThread:i=" + i + ",j=" + j);
}
if (bShouldSub) {
bShouldSub = false;
LOCK.notify();
if(i<49){
try {
LOCK.wait();
}catch (InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
}
}
public void SubThread() {
for (int i = 0; i < 50; i++) {
synchronized (LOCK){
for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName() + "+SubThread:i=" + i + ",j=" + j);
}
if (!bShouldSub) {
bShouldSub = true;
LOCK.notify();
if(i<49){
try {
LOCK.wait();
} catch (InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
}
}
}