查看: 1799|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]

566

主题

713

帖子

3827

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3827
楼主
跳转到指定楼层
发表于 2016-9-4 11:52:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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();
                        }                             
            }
      }
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 打开微信扫一扫