内部类如何操作外部类方法中的变量?

沙漠飞鹰 发布于 2012/07/17 15:54
阅读 3K+
收藏 0
我写了一个服务端处理大List数据进行分割多线程的方法,由于我定义了一个公共变量,所以当几个用户在同一时间操作这个方法时候,得到的结果会有相互干扰的情况,我想吧这个变量定义到方法内部,这样内部类中就不知道怎么操作这个变量了,事例代码如下:
public class DefaultFlowManager extends BaseManager implements FlowManager,Serializable{
		List<WorkFlowPlan>  muis=null;	
	/** 
     * 处理大List数据
     * @return  
     */   
	public List<WorkFlowPlan> getListInfo(int threadCounts, List list) {
		 muis=new ArrayList<WorkFlowPlan>();//初始化
		ExecutorService exec = Executors.newFixedThreadPool(threadCounts);
		if (list.isEmpty())
			return new ArrayList<WorkFlowPlan>();
		int len = list.size() / threadCounts;// 平均分割List
		// List中的数量没有线程数多(很少存在)
		if (len == 0) {
			threadCounts = list.size();// 采用一个线程处理List中的一个元素
			len = list.size() / threadCounts;// 重新平均分割List
		}
		CyclicBarrier barrier = new CyclicBarrier(threadCounts + 1);//障栅集合点(同步器)  
		for (int i = 0; i < threadCounts; i++) {
			// 创建线程任务
			if (i == threadCounts - 1) {// 最后一个线程承担剩下的所有元素的计算
				exec.execute(new SubWfpSumTask(list.subList(i * len, list.size()),barrier));
			} else {
				exec.execute(new SubWfpSumTask(list.subList(i * len, len * (i + 1) > list.size() ? list.size() : len * (i + 1)),barrier));
			}
		}
		try {
			barrier.await();// 关键,使该线程在障栅处等待,直到所有的线程都到达障栅处
		} catch (InterruptedException e) {
			System.out.println(Thread.currentThread().getName() + ":Interrupted");
		} catch (BrokenBarrierException e) {
			System.out.println(Thread.currentThread().getName() + ":BrokenBarrier");
		}
		exec.shutdown();

		MyComparator mc = new MyComparator() ;

		Collections.sort(muis, mc); // 顺序排列 
		System.out.println(muis.size());
		return muis;
	}  


	class SubWfpSumTask implements Runnable{    
        private List<WorkFlowPlan>wfpList;    
        private   CyclicBarrier barrier;
        public SubWfpSumTask(List<WorkFlowPlan> wfpList, CyclicBarrier barrier) {    
            this.wfpList=wfpList;  
            this.barrier=barrier;
         }   
        
        public void run() {    
        	List<WorkFlowPlan>submuis=new ArrayList<WorkFlowPlan>();  	
            for (WorkFlowPlan wfp:wfpList) {
                wfp=paysManager.getAllWFP(wfp);
        		submuis.add(wfp);

        	}      
            synchronized(this){//同步    
            	muis.addAll(submuis) ; 
             }    
            try {    
                 barrier.await();//关键,使该线程在障栅处等待,直到所有的线程都到达障栅处    

             } catch (InterruptedException e) {    
                 System.out.println(Thread.currentThread().getName()+":Interrupted");    
             } catch (BrokenBarrierException e) {    
                 System.out.println(Thread.currentThread().getName()+":BrokenBarrier");    
             }    
         }    
            
     }    


	

    @Override
    public List<WorkFlowPlan>compositWorkFlowPlan(List<WorkFlowPlan>wfpList)throws Exception {
    	Map<Long,Pays> paysMap = new HashMap<Long,Pays>();
    	List<WorkFlowPlan>wfpLists=new ArrayList<WorkFlowPlan>();
    	wfpList=this.loadAll(wfpList);
		Long i=0L;
		for(WorkFlowPlan wfp:wfpList){
			wfp.setOrderID(i++);
		}
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		String thisDate=df.format(new Date());
		wfpLists=getListInfo(8, wfpList);
		

    	return wfpLists;
    }


	
}

加载中
0
情天大圣
情天大圣
貌似不可以吧?
0
沙漠飞鹰

引用来自“情天大圣”的答案

貌似不可以吧?

我也没想到办法,又要是分线程来做的,也不太方便做成传参数再return

0
逝水fox
逝水fox

内部类作为方法的内部类,并且要求局部变量必须是final的

public void fun() {
	final Object[] pro = new Object[1];

	class Test {
		public void setPro(Object value) {
			pro[0] = value;
		}

		public Object getPro() {
			return pro[0];
		}
	}

	Test obj = new Test();
	obj.setPro("123");
	System.out.println(obj.getPro());
}

不知道你是否是想实现这样的功能。

 

 

逝水fox
逝水fox
如果是这样的话 可以考虑直接吧变量搞到内部类里面去,每个方法开始new个内部类对象,然后通过内部类提供的set和get来操作变量,要方便很多。
0
沙漠飞鹰

引用来自“逝水fox”的答案

内部类作为方法的内部类,并且要求局部变量必须是final的

public void fun() {
	final Object[] pro = new Object[1];

	class Test {
		public void setPro(Object value) {
			pro[0] = value;
		}

		public Object getPro() {
			return pro[0];
		}
	}

	Test obj = new Test();
	obj.setPro("123");
	System.out.println(obj.getPro());
}

不知道你是否是想实现这样的功能。

 

 

呵呵谢谢给了我一些灵感
0
flygogo
flygogo
你这个 很适合 用 Java 7 中的 Fork/Join   这个框架,具体可以看这里的例子 http://zhaohaolin.iteye.com/blog/964307,  如果不是jdk7 的话 可以单独引入 jsr166y的jar包
0
jobell
jobell
用反射。
0
OrionBox
OrionBox
简单啊。外部类.this然后就调用了
返回顶部
顶部