Fork/Join 프레임(하나):Fork/Join 만들기

4853 단어
Fork/Join 프레임워크 하면 실행기 프레임워크(Executor Framework)를 꺼내지 않고 작업의 생성과 실행을 분리합니다. Executor Framework를 통해 Runnable 인터페이스의 대상과 Executor 대상을 사용한 다음에 Runnable 대상을 실행기로 보냅니다.실행기는 이 작업을 실행하는 데 필요한 루틴을 책임진다. 루틴의 생성, 루틴의 관리, 루틴의 끝을 포함한다.
자바 7은 Executor 서비스 인터페이스의 또 다른 구현을 포함하여 특수한 유형의 문제를 해결하는 데 더욱 가까워졌다."Fork/Join 프레임입니다.""분해/결합 프레임""이라고도 합니다."
Fork/Join 프레임워크는 분치 기술을 통해 문제를 작은 임무로 나눌 수 있는 문제를 해결하는 데 쓰인다.그것과 실행기 프레임워크의 차이는 작업 도둑질 알고리즘에 있다.
다음은 간단한 예를 실현하고 우리는 제품 가격을 갱신하는 임무를 실현한다.최초의 작업은 목록에 있는 모든 요소의 가격을 업데이트하는 것을 책임질 것입니다.10개 이상의 요소를 업데이트해야 하는 작업은 두 부분으로 나뉘어 실행됩니다.그리고 각 부분의 제품 가격을 갱신하세요.
1、 , 
package five2;
/**
 * 
 * @author qpx
 *
 */
public class Product {
	
	private String name;
	private double price;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	
	

}

2. 무작위 제품 목록을 생성하는 클래스 만들기
package five2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 *  
 * @author qpx
 *
 */
public class productListGenetator {
	
	public List<Product> genetate(int size){
		
		List<Product> products = new ArrayList<>();
		for(int i = 0 ;i<size;i++){
			Product product = new Product();
			product.setName("Product"+i);
			product.setPrice(10);
			products.add(product);
			
			
		}
		return products;
		
	}
	
	public static void main(String[] args) {
		List<Integer> aaa = new ArrayList<Integer>();
		aaa.add(1);
		aaa.add(0, 2);
		
		System.out.println(Arrays.toString(aaa.toArray()));
	}

}

3. Task 클래스를 만들고 Recursive Action 클래스를 계승합니다. 이것은 주 작업 클래스입니다.
package five2;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.TimeUnit;

public class Task extends RecursiveAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private List<Product> products;

	private int first;
	private int last;

	private double increment;

	public Task(List<Product> products, int first, int last, double increment) {
		super();
		this.products = products;
		this.first = first;
		this.last = last;
		this.increment = increment;
	}

	@Override
	protected void compute() {
		// TODO Auto-generated method stub‘
		if (this.last - this.first < 10) {

			updateprices();
		} else {
			int middle = (last + first) / 2+1;
			//System.out.println("middle:"+middle);
			System.out.printf(Thread.currentThread().getName()+"  Task:Pending tasks:%s
", getQueuedTaskCount()); Task t1 = new Task(products, first, (middle), increment); //System.out.println("t1:first:"+first+",last:"+middle); Task t2 = new Task(products, middle, last, increment); //System.out.println("t2:first:"+middle+",last:"+last); invokeAll(t1, t2); } } private void updateprices() { // TODO Auto-generated method stub for (int i = first; i < last; i++) { Product product = products.get(i); product.setPrice(product.getPrice() * (1 + increment)); System.out.println(Thread.currentThread().getName() + " i :"                         + i);     } } public static void main(String[] args) throws InterruptedException { productListGenetator a = new productListGenetator(); List<Product> products = a.genetate(1000); Task task = new Task(products,0,products.size(),0.20); //ForkJoinPool pool = new ForkJoinPool(10);         ForkJoinPool pool = new ForkJoinPool(); pool.submit(task); do{ System.out.printf("Main:  :%d
",pool.getActiveThreadCount()); System.out.printf("Main: Thread  :%d
",pool.getStealCount()); System.out.printf("Main: Thread  :%d
",pool.getParallelism()); TimeUnit.MILLISECONDS.sleep(5); }while(!task.isDone()); pool.shutdown(); if(task.isCompletedNormally()){ System.out.printf("Main: The process has completed normally.
"); } for(int i = 0;i<products.size();i++){ Product p = products.get(i); if(p.getPrice()!=12){ System.out.printf("Product %s:%f
",p.getName(),p.getName()); } } System.out.printf("Main:End of the Program.
"); } }

주의: 우리는 무삼의 구조 방식을 채택하여 창설하였다
ForkJoinPool pool = new ForkJoinPool();  , CPU 。

또한 ForkJionPool 클래스는 다음과 같은 방법으로 작업을 수행할 수 있습니다.
   
execute(Runnabletask)  Runnable ,ForkJionPool  。 ForkJoinTask 
invoke(ForkJoinTask<T> list)  execute , 

좋은 웹페이지 즐겨찾기