A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Francis-Yu

黑马帝

  • 黑马币:0

  • 帖子:10

  • 精华:0

© Francis-Yu 黑马帝   /  2012-5-1 21:20  /  1698 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
* 问题: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技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

3 个回复

倒序浏览
应该独立封装一个类来实现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;


评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
首先你的方法test4根本不可能执行,也没看到你的flag标记,你如果想将synchronized 修饰最小的代码块,完全可以在方法test3中以修饰代码块的方式对test4中的代码进行修饰。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
我的意思就是若有线程正在执行test4,设置一个flag。同时有线程进来执行test3的时候,就需要flag进行判断,是否有线程正在执行test4的操作,若有,则要进行等待。test3就是向list中add操作,test4就是遍历list的操作。遍历的同时是不能够进行add的操作。同时要将synchronized修饰的代码块设置最小。不知道怎样完善该代码?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马