日期:2014-05-20  浏览次数:20706 次

急求解java多线模拟同步的问题

/**
 * 问题:test1和test2为多线程的模拟器。同时调用test3()。本可以将test4的代码放在test3中,用一个synchronized修饰即可。
 * 但是:为了将synchronized 修饰最小的代码块,所以写了test3和test4两个方法。执行test4的时候,是不能够执行test3操作。
 * 采取的办法:1)test4 用synchronized修饰,一旦有线程执行test4,可以设置一个flag。
 * 2)用flag的标志去设置test3的执行与否(假设test4正在执行,flag=false,执行完了之后,flag=true.然后去判断flag,根据flag的标志决定是否执行test3)
 * 
 * 
 * */


import java.util.*;
public class Service implements Runnable{
/**
* 设为静态的list确保每一个线程执行的操作都是向同一个list中add数据.
* */
  static List<String>list=new ArrayList<String>();
  /**
  * 
  * 
  * test1和test2就是模拟多线程去调用test3*/
  public void test1(){
test3("aa");
  }
  public void test2(){
test3("bb");
 
  }
  /**
  * 
  * test3:往list中添加东西*/
 public void test3(String name){
for(int i=0;i<10;i++){
list.add(name+i);
}
 
 
}
 /**
  * 
  * 
  * test4是往控制台输出东西,但是test4中限制list中的size,一旦size==20,就进行输出。一旦进行输出的时候,test3就不能被调用
  * 也就是不能有线程去向list中执行add操作*/
 public synchronized void test4(){
if(list.size()==20){
for(int i=0;i<20;i++){
System.out.println(list.get(i));
}
 
}
}
  
 
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
test1();
test2();
}
}
public static void main(String[] args){
Thread t1=new Thread(new Service());
t1.start();
Thread t2=new Thread(new Service());
t2.start();
}
}


------解决方案--------------------
你搞的多线程太乱了。
1,test4方法考虑在时候时候执行,有考虑过嘛。
2,test1.test2根本没有必要重复写,完全多余.

public void test1(){
test3("aa");
}
public void test3(String name){
for(int i=0;i<10;i++){
list.add(name+i);
test4();//在添加之后执行test4.
}

 public void test4(){
if(list.size()==20){
synchronized (list){//同步集合
for(int i=0;i<20;i++){
System.out.println(list.get(i));
}
 }
}
}