johnny 发表于 2016-9-4 11:52:37

119、子线程循环10次,接着主线程循环100...请写出程序。

119、子线程循环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();                        }                                       }      }}

页: [1]
查看完整版本: 119、子线程循环10次,接着主线程循环100...请写出程序。