您现在的位置:首页 >> Java面试 >> 内容

Java笔试题之Java基础部分(五)

时间:2014-8-31 9:12:33

  核心提示:28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1...

28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
public class ThreadTest1
{
private int j;
public static void main(String args[]){
   ThreadTest1 tt=new ThreadTest1();
   Inc inc=tt.new Inc();
   Dec dec=tt.new Dec();
   for(int i=0;i<2;i++){
       Thread t=new Thread(inc);
       t.start();
     t=new Thread(dec);
       t.start();
       }
   }
private synchronized void inc(){
   j++;
   System.out.println(Thread.currentThread().getName()+"-inc:"+j);
   }
private synchronized void dec(){
   j--;
   System.out.println(Thread.currentThread().getName()+"-dec:"+j);
   }
class Inc implements Runnable{
   public void run(){
       for(int i=0;i<100;i++){
       inc();
       }
   }
}
class Dec implements Runnable{
   public void run(){
       for(int i=0;i<100;i++){
       dec();
       }
   }
}
}

----------随手再写的一个-------------
class A
{
JManger j =new JManager();
main()
{
 new A().call();
}

void call
{
 for(int i=0;i<2;i++)
 {
  new Thread(
   new Runnable(){ public void run(){while(true){j.accumulate()}}}
  ).start();
  new Thread(new Runnable(){ public void run(){while(true){j.sub()}}}).start();
 }
}
}

class JManager
{
 private j = 0;
 
 public synchronized void subtract()
 {
  j--
 }
 
 public synchronized void accumulate()
 {
  j++;
 }
 
}

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

Java面试

最终的程序代码如下:
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();
    }     
  }
 }
}

Java面试

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号