针对这个问题,需要使用线程互相协调完成工作,这样首先会想到在 synchronized 代码块中加入wait(),nodify()方法进行线程的协调配合完成工作,我这里使用了ReetrantLock的 Condition 机制去完成线程协调与配合,具体代码如下:
package com.thread.communication;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* 具体线程协调相关的类
*
* @author tangyifei
* @date 2019年8月22日10:55:05
*/
public class Bussiness {
private static boolean subFlag = true;
ReentrantLock reentrantLock = new ReentrantLock();
Condition mainCondition = reentrantLock.newCondition();
Condition subCondition = reentrantLock.newCondition();
public void mainMethod() {
reentrantLock.lock();
while (subFlag) {
try {
mainCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0; i < 2; i++) {
System.out.println(Thread.currentThread().getName()
+ " : main thread running loop count -- " + i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
subFlag = true;
subCondition.signal();
reentrantLock.unlock();
}
public void subMethod() {
reentrantLock.lock();
while (!subFlag) {
try {
subCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0; i < 4; i++) {
System.out.println(Thread.currentThread().getName()
+ " : sub thread running loop count -- " + i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
subFlag = false;
mainCondition.signal();
reentrantLock.unlock();
}
}
主类:
package com.thread.communication;
public class ThreadTest {
public static void main(String[] args) {
final Bussiness bussiness = new Bussiness();
new Thread(()->{
for(int i = 0; i < 3; i++) {
bussiness.subMethod();
}
}).start();
for(int i = 0; i < 3; i++) {
bussiness.mainMethod();
}
}
}
执行结果如下:
Thread-0 : sub thread running loop count -- 0
Thread-0 : sub thread running loop count -- 1
Thread-0 : sub thread running loop count -- 2
Thread-0 : sub thread running loop count -- 3
main : main thread running loop count -- 0
main : main thread running loop count -- 1
Thread-0 : sub thread running loop count -- 0
Thread-0 : sub thread running loop count -- 1
Thread-0 : sub thread running loop count -- 2
Thread-0 : sub thread running loop count -- 3
main : main thread running loop count -- 0
main : main thread running loop count -- 1
Thread-0 : sub thread running loop count -- 0
Thread-0 : sub thread running loop count -- 1
Thread-0 : sub thread running loop count -- 2
Thread-0 : sub thread running loop count -- 3
main : main thread running loop count -- 0
main : main thread running loop count -- 1
这样就实现了此功能。