黑马程序员技术交流社区
标题:
急求解java多线模拟同步的问题
[打印本页]
作者:
Francis-Yu
时间:
2012-5-1 21:20
标题:
急求解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();
}
}
作者:
贾联国
时间:
2012-5-1 21:47
应该独立封装一个类来实现Runnable接口,并在中函数中进行多线程,直接用主函数所在的类来实现接口有欠妥当,而且采用下面的代码:
public static void main(String[] args){
Thread t1=new Thread(new Service());
t1.start();
Thread t2=new Thread(new Service());
t2.start();
每次都新建立一个新的Service对象,建立新的集合也不好。
直接用
Service s=new Service();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
t1.start;
t2.start;
作者:
李培辉
时间:
2012-5-1 21:48
首先你的方法test4根本不可能执行,也没看到你的flag标记,你如果想将synchronized 修饰最小的代码块,完全可以在方法test3中以修饰代码块的方式对test4中的代码进行修饰。
作者:
Francis-Yu
时间:
2012-5-2 08:51
我的意思就是若有线程正在执行test4,设置一个flag。同时有线程进来执行test3的时候,就需要flag进行判断,是否有线程正在执行test4的操作,若有,则要进行等待。test3就是向list中add操作,test4就是遍历list的操作。遍历的同时是不能够进行add的操作。同时要将synchronized修饰的代码块设置最小。不知道怎样完善该代码?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2