描述:
子线程循环10次,主线程循环100,接着有回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
下面的是我写的:
public class Solution {
public static void main(String[] args) {
Bussiness bussiness = new Bussiness();
//子线程打印
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i<50;i++){
bussiness.sub1();
}
}
}).start();
//主线程打印
for(int i = 0;i<50;i++){
try {
bussiness.sub2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Bussiness{
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
boolean flag = true;
public void sub1(){
try {
lock.lock();
while (!flag){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0;i<10;i++){
System.out.println("sub1 ------"+i);
}
flag = false;
condition2.signal();
}finally {
lock.unlock();
}
}
public void sub2() throws InterruptedException {
try {
lock.lock();
while (flag){
condition2.await();
}
for(int i = 0;i<50;i++){
System.out.println("sub2 ---*****---"+i);
}
flag = true;
condition1.signal();
}finally {
lock.unlock();
}
}
}
}
加深难度
如果把上面的问题变成3个线程交替循环执行,该怎样写,如A线程打印完了执行B线程,B线程执行完了执行C线程,C线程执行完了执行A线程。如此循环50次:
public class ThreeConditionTest {
public static void main(String[] args) {
Bussiness bussiness = new Bussiness();
//子线程打印
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i<50;i++){
bussiness.sub1();
}
}
}).start();
//子线程2打印
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i<50;i++){
try {
bussiness.sub2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//子线程3打印
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i<50;i++){
try {
bussiness.sub3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
static class Bussiness{
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
int flag = 1;
public void sub1(){
try {
lock.lock();
while (flag != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0;i<10;i++){
System.out.println("sub1 ------"+i);
}
flag = 2;
condition2.signal();
}finally {
lock.unlock();
}
}
public void sub2() throws InterruptedException {
try {
lock.lock();
while (flag != 2){
condition2.await();
}
for(int i = 0;i<10;i++){
System.out.println("sub2 --2222---"+i);
}
flag = 3;
condition3.signal();
}finally {
lock.unlock();
}
}
public void sub3() throws InterruptedException {
lock.lock();
try{
while (flag != 3){
condition3.await();
}
for(int i = 0;i<10;i++){
System.out.println("sub3--*****-33333---"+i);
}
flag = 1;
condition1.signal();
}finally {
lock.unlock();
}
}
}
}