今天爱分享给大家带来子线程循环 10 次,接着主线程循环 100,接着又回到子线程循环 10 次,接着再回到主线程又循环 100,如此循环 50 次,请写出程序。【面试题详解】,希望能够帮助到大家。
public class ThreadTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub 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) { // TODO Auto-generated catch block 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) { // TODO Auto-generated catch block 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) { // TODO Auto-generated method stub /*new Thread(){ public void run() { for(int i=0;i<50;i++) { for(int j=0;j<10;j++) { System.out.println("i=" + i + ",j=" + j); } } } }.start();*/ //final String str = new String(""); 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.newFixedThreadPool(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(); } } }