急求解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));
}
}
}
}