01 + 고급 언어의 기초 : 1-7 이상 및 멀티 스레드 _day07 [스레드 풀, 람다 표현식]

day07 [스레드 풀 람다 식]

주요 내용

  • 대기 모닝콜 경우
  • 스레드 풀
  • 람다 표현식

교육 목표

[-] 통신 스레드의 개념을 이해할 수
[-] 대기 웨이크 업 메커니즘을 이해할 수
[-] 자바 스레드 풀의 동작 원리를 설명 할 수
[-] 함수형 프로그래밍 객체 지향 장점에 대해 이해 될 수
[-] 람다 식을 파악할 수있다 표준 포맷
[-] 람다 표준 포맷이 사용될 수 있고 비교기 인터페이스의 Runnable
-] 포맷 규칙을 생략 람다 식을 파악할 수
[-] 람다 및 비교기 인터페이스의 Runnable 사용을 생략 할 수 형식
-] 표준 포맷을 통해 람다 사용자 지정 인터페이스 (단지 추상적 법)
[-] 람다 형식을 생략하여 인터페이스 정의 (단지 추상적 법)에서 사용할 수있다
[-] 두 가지를 사용하여 명확하게 람다 전제 될 수있다


1.1 스레드 간 통신

개념 : 동일한 리소스에 작업을 여러 스레드, 그 작업 (스레드 작업은) 동일하게 취급되지 않습니다.

1.2 대기 웨이크 업 (wake-up)

웨이크 업 (wake-up)에 무엇을 기다리고 있습니다

이것은 여러 스레드 중 하나입니다 조정 메커니즘. 우리는 종종 스레드의 생각 스레드간에 제공은 경쟁 (경주) 경쟁을 예를 들어, 잠금 ,하지만이 모든 이야기하지, 스레드 간의 협력 메커니즘이 될 것입니다. 더 자주 증진을위한 경쟁 만이있을 때 당신과 당신의 동료, 당신은 더 특정 작업을 수행하기 위해 함께 일할 수있는 회사처럼.

스레드가 소정의 동작 후, 대기 상태를 (입사 대기를 () )는 지정된 코드의 종료 후, 다른 스레드는 웨이크 후에도 실행 대기 ( 알림 () ) 경우, 대기 다중 스레드있을 때 필요의 notifyAll ()가 모든 대기 스레드를 깨워 사용합니다.

통지 / 대기하는 스레드 간의 협력 메커니즘입니다.

이후 방법에 대기

다음과 같이 웨이크 업 (wake-up) 기다립니다은 세 가지 방법의 사용을 의미 스레드 사이의 통신 문제를 해결하는 데 사용됩니다 :

  1. 기다릴 : 스레드가 더 이상 더 이상 대기 집합으로, 일정에 참여 활성화, 그럼 대기 상태를 스레드, 잠금 경쟁, CPU 자원을하지 낭비하지 않습니다. 또한 수행하기 위해 다른 스레드를 기다리는 특정 작업을 ", 즉, (알림) 통지 의 스케줄링 큐 (준비 큐)를 다시 입력 명시된 대기에서 스레드의 릴리스가 나올 때까지 기다리는이 개체의"
  2. 예를 들어, 사용 가능 레스토랑의 위치, 고객이 가장 오래된 먼저 앉아 식사를 기다린 스레드 객체의 대기 세트가 릴리스에서 선택 통지 : 통지합니다.
  3. 가는 notifyAll : 알림 객체의 대기 세트에있는 모든 스레드가 해제됩니다.

참고 :

단지 대기 스레드를 알려하더라도 스레드는이 장소가 동기화 블록에 중단했기 때문에, 즉시 실행을 재개 통보,하지만 그 순간에 더 이상 잠금을 보유하고, 그래서 그녀는 아마 (다시 잠금을 획득하려고 할 필요가 될 수 없다 성공적인 호출 대기 후 원래 방법 후 장소에서 실행을 다시 시작하기 위해 다른 스레드의 경쟁)에 직면.

다음과 같이 요약 :

  • 당신이 잠금을 얻을 수 있다면, 스레드 상태를 기다리고에서 RUNNABLE 상태가된다;
  • 그렇지 않으면, 대기에서 밖으로 설정하고 엔트리 세트로, 스레드 상태를 기다리지 및 주 차단된다

대기 전화 및 통지 방법은 세부 사항에주의를 지불 할 필요

  1. 기다려 방법 방법은 동일한 로크 대상에 의해 호출되어야 통지. 이유는 대응 잠금 객체가 로크 대상으로 대기 메소드 호출 후에 스레드의 사용을 깨우 통지 할 수있다.
  2. 알리고 대기 방법은 객체의 클래스에 속하는 방법이다. 때문에 : 잠금 객체가 어떤 객체가 될 수 있으며, 클래스에 속하는 모든 객체는 Object 클래스를 상속됩니다.
  3. 알리고 대기있어서 동기 부호 블록 또는 동기 함수의 방법에 사용되어야한다. 때문에 두 개의 잠금 개체를 통해이 메소드를 호출해야합니다.

/ *
    자원 클래스 : 클래스 빵
    만두의 속성을 설정합니다
        가죽
        주 만두 : 거짓, 사실이 아니다 있습니다
 * / 
공공  클래스 바 오즈 {
     // 피부 
    문자열 PI;
     // 트랩 
    문자열 시안 (西安);
     // 롤빵 상태 : 사실 어떤 거짓, 아니 초기 값은 false 만두가 설정되지 
    부울 플래그입니다 =에서 거짓 ;

}
공용 클래스 바 오즈
/ *
    프로듀서 (바 오즈 푸) 클래스 : 스레드 클래스는 스레드를 상속 할 수있다
    설정 스레드 작업 (실행) : 생산 빵
    만두의 상태를 판단하려면
    사실 : 만두가있다
        바 오즈 푸는 대기 상태로 대기 메소드를 호출
    거짓 : 더 롤빵 없다
        빵의 바 오즈 푸 생산
        재미를 추가 번갈아 두 개의 만두를 생산
            두 상태 (I % 2 == 0)이있다
        바 오즈 푸 좋은 만두를 생산
        상태를 수정하는 것은 사실이다 만두가있다
        상품 스레드를 먹고 웨이크 스레드 롤빵 식품 제품 때문에

    참고 :
        바 오즈 푸 스레드와 스레드 관계 만두 -> 통신 (상호 배타적)
        동기화 기술은 있는지 확인해야합니다 하나에 두 개의 스레드 실행
        잠금 객체가 고유 보장해야합니다, 당신은 락 객체 빵으로 객체를 사용할 수 있습니다
        바 오즈 푸 제품 범주를 먹고 클래스는 매개 변수로 전달 만두 객체를 필요
            1. 필요 멤버 변수 위치에서 빵을 만들
            가변 할당 롤빵 건설 파라미터 항에있어서,
 * / 
공공  클래스 BaoZiPu (가) 확장 스레드는 {
     // 1. 멤버 변수 위치에 빵 만들 
    개인 바 오즈의 BZ을;

    // 가변 롤빵 할당 2. 생성자 파라미터 
    공개 BaoZiPu (바 오즈의 BZ) {
         이 본 .BZ = BZ;
    }

    //는 스레드 작업 (실행)을 설정 : 빵의 생산 
    @Override
     공공  무효 실행 () {
         // 변수의 정의 
        INT의 COUNT = 0 ;
         // 바 오즈 푸 생산 된 만두 만들기 
        그동안을 ( ) {
             //이 두 기술을 보장하기 위해 동기화해야합니다 실행에서 하나 개의 스레드 
            동기화 (BZ)는 {
                 // 상태 빵 판정 
                IF (== bz.flag 는 true ) {
                     // 바오 Zipu 통화 대기 방법은, 대기 상태에 들어간다 
                    은 try {
                        bz.wait ();
                    } 캐치 (예외 : InterruptedException 전자) {
                        e.printStackTrace ();
                    }
                }

                // 모닝콜 후에 수행 빵의 제조는 바 오즈 푸
                 // 흥미로운를 추가 교대 개의 만두를 제조 
                IF (COUNT % 2 == 0 ) {
                     // 얇은 피부 세 신선한 박제 빵의 제조 
                    bz.pi = "얇은 피부" ;
                    bz.xian = "샘 썬 소" ;
                } 다른 {
                     // 쇠고기 양파 눈 트랩의 생산 
                    bz.pi = "눈" ;
                    bz.xian = "쇠고기 양파 붙어" ;

                }
                카운트 ++ ;
                에서 System.out.println ( "생산 바오 Zipu입니다 :"+ bz.pi + bz.xian + "만두" );
                 // 생산 3 초 만두 걸리는 
                은 try를 {
                    Thread.sleep를 ( 3000 );
                } 캐치 (예외 : InterruptedException 전자) {
                    e.printStackTrace ();
                }
                // 바 오즈 푸 생산 잘 만두
                 // 상태가 사실 만두를 수정 
                bz.flag = 진정한 ;
                 // 그 음식 상품 스레드가 롤빵, 그래서 웨이크 식품 제품 스레드 
                ) (bz.notify;
                에서 System.out.println는 ( "좋은 바 오즈 푸 생산하고있다 :"+ bz.pi + bz.xian + "만두, 당신은 음식 제품을 먹고 시작할 수 있습니다" );
            }
        }
    }
}
공용 클래스 BaoZiPu는 스레드를 확장
/ *
    소비자 (식품 제품) 카테고리 : 스레드 클래스는 스레드를 상속 할 수 있습니다
    설정 스레드 작업 (실행) : 롤빵
    만두의 상태를 판단하려면
    거짓 : 더 롤빵 없다
        식품 제품은 대기 상태로 대기 메소드를 호출
    사실 : 만두가있다
        식품 제품 롤빵
        빵 식품 제품을 먹고
        상태가 거짓없는 빵 수정
        식품 상품 바 오즈 푸 스레드를 깨워, 만두 생산
 * / 
공공  클래스 ChiHuo는 를 확장 스레드가 {
     // 1. 멤버 변수 위치에 빵 만들 
    개인 바 오즈의 BZ을;

    // 가변 롤빵 할당 2. 생성자 파라미터 
    공개 ChiHuo (바 오즈의 BZ) {
         이 본 .BZ = BZ;
    }
    // 롤빵 : 스레드 작업 (실행)을 설정 
    @Override
     공공  무효 {) RUN을 (
         // 제품이 빵을 먹고있다, 그래서 무한 루프를 사용 
        그동안을 ( ) {
             //이 만 한 두 개의 스레드를 보장하기 위해 동기식 기술이 있어야합니다 실행 
            동기화 (BZ를) {
                 // 상태 만두 판단하는 
                IF (bz.flag == 거짓을 ) {
                     // 식품 제품이 대기 상태로 대기 메소드를 호출 
                    은 try {
                        bz.wait ();
                    } 캐치 (예외 : InterruptedException 전자) {
                        e.printStackTrace ();
                    }
                }

                // 코드가 웨이크 업, 롤빵 후 실행 
                에서 System.out.println ( "식품 제품을 먹고 있었다 :"+ bz.pi + bz.xian + "만두" );
                 // 먹을 빵 완제품은
                 // 빵의 상태를 수정 거짓 
                bz.flag = 거짓 ;
                 // 식품 상품 바 오즈 푸 스레드를 깨워, 생산 만두 
                bz.notify 없다 ();
                에서 System.out.println ( "식품 제품은 넣어왔다 :"+ bz.pi bz.xian + "완료 만두, 바 오즈 푸 만두를 생산하기 시작했다"+ );
                에서 System.out.println ( "------------------------------------------- --------- " );
            }
        }
    }
}
공용 클래스 ChiHuo는 스레드를 확장
/ *
    시험 종류 :
    그것은 메인 메소드를 포함하는 프로그램을 실행 입구 개시제
    만두 객체를 생성하는 단계;
    바 오즈 푸 스레드가 생성, 공개, 만두의 생산;
    식품 제품 스레드를 열고, 빵을 만들기;
 * / 
공공  클래스 데모 {
     공공  정적  무효 메인 (문자열 []에 args) {
         // 객체 빵 만드는, 
        바 오즈의 BZ = 새로운 새로운 바 오즈을 ();
         // 바오 Zipu 스레드 차례, 만두의 생산을 만들고, 
        새로운 새로운 BaoZiPu (BZ) .start ();
         // 식품 제품 스레드를 열고, 롤빵을 만들어, 
        새로운 새로운 ChiHuo (BZ) .start를 ();
    }
}

장 스레드 풀

스레드 풀 아이디어의 2.1 개요

우리가 달성하기 위해,하지만 문제가있을 것입니다 매우 쉽게, 그래서 스레드를 생성하기 위해 스레드를 사용하는 갔을 때 :

많은 동시 스레드의 수, 각 스레드가 매우 짧은 시간에 실행하면 작업이 너무 자주 스레드가 매우 빈번한 쓰레드 생성 및 스레드의 파괴는 시간이 걸린다의 시스템의 효율성을 줄일 생성 끝났습니다.

스레드가 파괴되지 않는 작업을 실행 한 후, 즉, 재사용 할 수 있지만 다른 작업을 계속 수행 할 수 있도록 방법이 있나요?

자바,이 효과는 스레드 풀에 의해 달성 될 수있다. 오늘 우리는 무엇을 자바 스레드 풀 자세히 설명 할 것이다.

2.2 스레드 풀 개념

  • 스레드 풀 : 반복적으로 스레드를 생성하고 너무 많은 자원을 소모하지 않고 사실, 스레드가 종종 필요성을 제거, 반복적으로 사용할 수있는 수납 용기 다중 스레드, 스레드 개체 작업을 만듭니다.

스레드 풀 작업의 많은 자원의 최적화에 관련되어 있기 때문에, 우리는 여기가 그들을 반복하지 않는 것입니다. 우리는 어떻게 스레드 풀을 이해하는지도를 전달합니다 :

세 혜택을 가져올 수있는 스레드 풀의 합리적인 사용 :

  1. 자원 소비를 줄일 수 있습니다. 스레드의 생성과 파괴의 수를 줄이면, 각 작업자 스레드는 여러 작업을 수행 할 수 있습니다, 재사용 할 수 있습니다.
  2. 응답 속도를 향상시킬 수 있습니다. 미션이 도착하면 작업은 스레드 생성 즉시 구현 될 수있을 때까지 기다릴 필요가 없습니다 수 있습니다.
  3. 관리 성을 향상 스레드. 서버 (각 스레드가 1MB의 메모리 얻어 자신을 레코딩하는 동안, 시스템의 용량에 따라, 조정 줄 스레드 풀 스레드 수가 있기 때문에 메모리의 과도한 소모의 방지 이상의 스레드가 열려, 또한 메모리를 소비 ) 마지막 충돌 큰.

스레드 풀의 2.3 사용

최상위 인터페이스 내부에 자바 스레드 풀은 java.util.concurrent.Executor있지만, 엄밀히 말하면이 Executor아닌 스레드 풀,하지만 실행 도구의 하나 개의 스레드입니다. 실제 스레드 풀 인터페이스입니다 java.util.concurrent.ExecutorService.

스레드 풀은 특히 스레드 풀의 원칙 아래를 들어, 더 복잡 구성하려면 매우 명확하지 않다, 스레드 풀의 가능성이 구성이 우수하지, 따라서 java.util.concurrent.Executors클래스 내부의 정적 공장 스레드 공장을 제공하며, 일부를 생성 일반적인 스레드 풀. 이 관계자는 스레드 풀 개체를 만들 실행자 엔지니어링을 추천했다.

다음과 같이 집행 클래스는 스레드 풀을 만들었습니다 :

  • public static ExecutorService newFixedThreadPool(int nThreads): 스레드 풀 오브젝트를 돌려줍니다. (만든 최대 수를 지정할 수 있습니다 풀의 스레드 수는 경계 스레드 풀입니다)

스레드 풀 ExecutorService를 객체를 얻으려면, 그것을 사용하는 방법, 우리가 다음과 같이 스레드 풀 개체를 사용하는 방법을 정의합니다 :

  • public Future<?> submit(Runnable task): 하나 개의 스레드 풀 스레드 개체 가져 오기를 수행

    미래 인터페이스 : 작업이 완료되면 스레드의 결과를 기록하는 데 사용됩니다. 만들기 및 스레드 풀을 사용하여.

단계 스레드 풀 스레드 개체를 사용 :

  1. 스레드 풀 개체를 만듭니다.
  2. 실행 가능한 인터페이스는 하위 개체를 만들 수 있습니다. (작업)
  3. 의 Runnable 인터페이스 서브 클래스 객체를 제출합니다. (작업을 가지고)
  4. 스레드 풀을 (일반적으로하지)를 닫습니다.

실행 가능한 구현 클래스 코드 :

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("我要一个教练");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("教练来了: " + Thread.currentThread().getName());
        System.out.println("教我游泳,交完后,教练回到了游泳池");
    }
}

테스트 클래스 스레드 풀 :

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建线程池对象
        ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
        // 创建Runnable实例对象
        MyRunnable r = new MyRunnable();

        //自己创建线程对象的方式
        // Thread t = new Thread(r);
        // t.start(); ---> 调用MyRunnable中的run()

        // 从线程池中获取线程对象,然后调用MyRunnable中的run()
        service.submit(r);
        // 再获取个线程对象,调用MyRunnable中的run()
        service.submit(r);
        service.submit(r);
        // 注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。
        // 将使用完的线程又归还到了线程池中
        // 关闭线程池
        //service.shutdown();
    }
}

 

장 람다 표현식

개요 3.1 기능 프로그래밍 아이디어

 

 

 

 

 

 

 

 

===================================

 

추천

출처www.cnblogs.com/MarlonKang/p/11796100.html