평행 및 직렬 스트림
병렬 스트림은 컨텐츠를 여러 데이터 블록으로 나누고 각 데이터 블록의 스트림을 다른 스레드로 개별적으로 처리하는 것입니다.
병렬 최적화는 Java 8에서 수행되므로 데이터를 병렬로 쉽게 작동 할 수 있습니다. 스트림 API는 병렬 () 및 순차적 ()을 통해 병렬 및 순차 스트림 사이를 선언적으로 전환 할 수 있습니다.
포크/조인 프레임 워크를 이해하십시오
포크/조인 프레임 워크 : 필요한 경우 큰 작업이 여러 작은 작업으로 나뉘어져 (분해 할 수없는 경우) 각 작은 작업의 실행 결과가 함께 추가됩니다.
포크/조인 프레임 워크와 전통적인 스레드 풀의 차이점 :
"워크 스테이킹"모드 사용 :
새 작업이 실행되면 더 작은 작업 실행으로 분할되어 스레드 큐에 작은 작업을 추가 한 다음 임의의 스레드 대기열에서 하나를 훔쳐 자체 대기열에 넣을 수 있습니다.
일반 스레드 풀 구현과 비교하여 포크/조인 프레임 워크의 장점은 여기에 포함 된 작업을 처리하는 방식으로 반영됩니다. 일반 스레드 풀에서 스레드가 어떤 이유로 계속 실행할 수없는 작업을 실행하는 경우 스레드는 대기 상태에 있습니다. 그러나 포크/조인 프레임 워크 구현에서, 하위 프로젝트가 다른 하위 프로젝트의 완료를 기다리고 있기 때문에 하위 프로젝트가 계속 실행될 수없는 경우. 그런 다음 하위 프로젝트를 처리하는 스레드는 아직 실행을 위해 실행되지 않은 다른 하위 문제를 적극적으로 찾을 것입니다. 이 방법은 스레드의 대기 시간을 줄이고 성능을 향상시킵니다.
import java.time.duration; import java.time.instant; import java.util.concurrent.forkjoinpool; import java.util.concurrent.forkjointask; import java.util.concurrent.recursivetask; import java.util.stream.longstream; "problic voidjoin {problic voidjoin voidjoin void a voblic voidjoin {problic classe (problic class); xx) {} private static void test1 () {instant start = instant.now (); Forkjoinpool Pool = 새로운 ForkJoinPool (); Forkjointask <long> task = 새로운 Forkjoincalculate (0L, 10000000000L); long sum = pool.invoke (작업); System.out.println (sum); 즉시 끝 = instant.now (); System.out.println ( "소비 시간"+duration.between (start, end) .tomillis ()+"ms"); // 소비 시간 3409ms} private static void test2 () {instant start = instant.now (); long sum = longstream.rangeclosed (0l, 10000l) .parallel () .reduce (0, long :: sum); System.out.println (sum); 즉시 끝 = instant.now (); System.out.println ( "소비 시간" + 지속 시간 (시작, 종료) .tomillis () + "ms"); // 소비 시간 2418ms}} class forkjoincalculate recursiveTask <long> {private static final long serialversionuid = 1234567890L; // Serial Long Start; 개인 장수; 개인 정적 최종 긴 임계 값 = 2500000000L; // 임계 값 public forkjoincalculate (Long Start, Long End) {this.start = start; this.end = 끝; } @override protected long compute () {long length = end- 시작; if (length <= threshold) {long sum = 0; for (long i = start; i <= end; i ++) {sum+= i; } 반환 합계; } else {long middle = (start+end)/2; Forkjoincalculate left = 새로운 포크 조인 컬렉션 (시작, 중간); left.fork (); Forkjoincalculate Right = New Forkjoincalculate (중간+1, 끝); 오른쪽 .fork (); 왼쪽 왼쪽 join () + right.join (); }}}선택적 클래스
옵션 <t> class (java.util.optional)는 값이 존재하는지 또는 존재하지 않는지를 나타내는 컨테이너 클래스입니다.
NULL은 값이 존재하지 않음을 의미하며 이제 선택 사항 이이 개념을 더 잘 표현할 수 있습니다. 그리고 널 포인터 예외를 피할 수 있습니다.
일반적인 방법 :
옵션 (t t) : 옵션 인스턴스를 만듭니다
옵션 .empty () : 빈 선택적 인스턴스를 만듭니다
OPTION.OFNULLABLE (t t) : t가 null이 아닌 경우 옵션 인스턴스를 작성하고 그렇지 않으면 빈 인스턴스를 만듭니다.
ispresent () : 값이 포함되어 있는지 확인합니다
Orelse (t t) : 호출 객체에 값이 포함 된 경우 값을 반환하고 그렇지 않으면 t를 반환합니다.
ORELSEGET (Supplier S) : 통화 객체에 값이 포함 된 경우 s로 얻은 값을 반환하십시오.
map (function f) : 처리 할 값이 있고 처리 된 옵션을 반환하는 경우 옵션을 반환합니다.
FlatMap (Function Mapper) :지도와 유사하게 반환 값은 선택 사항이어야합니다.
public class optionalTest1 {public static void main (string [] args) {string s = new String ( "ha"); // 옵션 <string> op = 옵션 (null); // // string s1 = op.get (); // system.out.println (s1); // 옵션 <string> op1 = 옵션 .empty.empty (); // string s1 = op1.get (); // system.out.println (s1); 옵션 <string> op1 = Optional.ofNullable (null); // system.out.println (op1.ispresent ()); // system.out.println (op1.orelse (새 문자열 ( "google")); //system.out.println (op1.orelseget (() -> new String ( "ali")); 옵션 <string> op2 = op1.map ((x) -> x.tolowercase ()); 문자열 s2 = op2.get (); System.out.println (S2); }} @test public void test5 () {man man = new man (); 문자열 이름 = getGodnessName (man); System.out.println (이름); } // 요구 사항 : 사람의 마음에 여신의 이름을 얻습니다. 공개 문자열 getgodnessname (man man) {if (man! = null) {신성 g = man.getgod (); if (g! = null) {return g.getName (); }} 반환 "교사 cang"; } // 선택적 엔티티 클래스 @Test Public void test6 () {옵션 <신성> 신성 = 옵션 .ofNullable (새로운 신성 ( "Lin Chiling")); 옵션 <newman> op = 옵션 .ofNullable (New Newman (신성)); 문자열 이름 = getGodnessName2 (op); System.out.println (이름); } public String getGodnessName2 (옵션 <Newman> man) {return man.orelse (new newman ()) .getGodness () .Orelse (New Ghodness ( "Teacher Cang")) .getName (); } // 참고 : 선택 사항은 직렬화 될 수 없습니다. 공개 클래스 Newman {개인 옵션 <신성> 신성 = 옵션 .empty (); 사적인 신의 신; 공개 옵션 <신성> getgod () {return optional.of (God); } public newman () {} public Newman (선택적 <신성> 신성) {this.godness = 신성; } 공개 선택 사항 <신성> getGodness () {귀환 신성함; } public void setgodness (선택 사례 <신성> 신성) {this.godness = 신성함; } @override public String toString () {return "newman [신성 =" + 신성 + "]; }}위의 것은 Java 8의 지게차 및 선택적 프레임 워크를 사용한 모든 경험입니다. 학습 할 때 이해하지 못하는 것을 여전히 이해하지 못하면 아래 메시지 영역에서 논의 할 수 있습니다.