Fork/Join 프레임(하나):Fork/Join 만들기
자바 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 ,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.