子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。

多线程浏览:282收藏:1
答案:
最终的程序代码如下:
public class ThreadTest {

public static void main(String[] args) {
new ThreadTest().init();

}

public void init() {
final Business business = new Business();
new Thread(new Runnable() {

public void run() {
for (int i = 0; i < 50; i++) {
business.SubThread(i);
}
}
}).start();

for (int i = 0; i < 50; i++) {
business.MainThread(i);
}
}

private class Business {
boolean bShouldSub = true;// 这里相当于定义了控制该谁执行的一个信号灯

public synchronized void MainThread(int i) {
if (bShouldSub)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i + ",j=" + j);
}
bShouldSub = true;
this.notify();

}

public synchronized void SubThread(int i) {
if (!bShouldSub)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i + ",j=" + j);
}
bShouldSub = false;
this.notify();
}
}
}

备注:不可能一上来就写出上面的完整代码,最初写出来的代码如下,问题在于两个线程的代码要参照同一个变量,即这两个线程的代码要共享数据,所以,把这两个线程的执行代码搬到同一个类中去:
package com.huawei.interview.lym;

public class ThreadTest {

private static boolean bShouldMain = false;

public static void main(String[] args) {

new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
synchronized (ThreadTest.class) {
if (bShouldMain) {
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + "i=" + i + ",j=" + j);
}
bShouldMain = true;
ThreadTest.class.notify();
}
}
}
}).start();

for (int i = 0; i < 50; i++) {
synchronized (ThreadTest.class) {
if (!bShouldMain) {
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName() + "i=" + i + ",j=" + j);
}
bShouldMain = false;
ThreadTest.class.notify();
}
}
}

}
下面使用jdk5中的并发库来实现的:
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;

public class ThreadTest {
private static Lock lock = new ReentrantLock();
private static Condition subThreadCondition = lock.newCondition();
private static boolean bBhouldSubThread = false;

public static void main(String[] args) {
ExecutorService threadPool = Executors.new FixedThreadPool(3);
threadPool.execute(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
lock.lock();
try {
if (!bBhouldSubThread)
subThreadCondition.await();
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + ",j=" + j);
}
bBhouldSubThread = false;
subThreadCondition.signal();
} catch (Exception e) {
} finally {
lock.unlock();
}
}
}
});
threadPool.shutdown();
for (int i = 0; i < 50; i++) {
lock.lock();
try {
if (bBhouldSubThread)
subThreadCondition.await();
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName() + ",j=" + j);
}
bBhouldSubThread = true;
subThreadCondition.signal();
} catch (Exception e) {
} finally {
lock.unlock();
}
}
}
}