day07 [스레드 풀 람다 식]
주요 내용
- 대기 모닝콜 경우
- 스레드 풀
- 람다 표현식
교육 목표
[-] 통신 스레드의 개념을 이해할 수
[-] 대기 웨이크 업 메커니즘을 이해할 수
[-] 자바 스레드 풀의 동작 원리를 설명 할 수
[-] 함수형 프로그래밍 객체 지향 장점에 대해 이해 될 수
[-] 람다 식을 파악할 수있다 표준 포맷
[-] 람다 표준 포맷이 사용될 수 있고 비교기 인터페이스의 Runnable
-] 포맷 규칙을 생략 람다 식을 파악할 수
[-] 람다 및 비교기 인터페이스의 Runnable 사용을 생략 할 수 형식
-] 표준 포맷을 통해 람다 사용자 지정 인터페이스 (단지 추상적 법)
[-] 람다 형식을 생략하여 인터페이스 정의 (단지 추상적 법)에서 사용할 수있다
[-] 두 가지를 사용하여 명확하게 람다 전제 될 수있다
1.1 스레드 간 통신
개념 : 동일한 리소스에 작업을 여러 스레드, 그 작업 (스레드 작업은) 동일하게 취급되지 않습니다.
1.2 대기 웨이크 업 (wake-up)
웨이크 업 (wake-up)에 무엇을 기다리고 있습니다
이것은 여러 스레드 중 하나입니다 조정 메커니즘. 우리는 종종 스레드의 생각 스레드간에 제공은 경쟁 (경주) 경쟁을 예를 들어, 잠금 ,하지만이 모든 이야기하지, 스레드 간의 협력 메커니즘이 될 것입니다. 더 자주 증진을위한 경쟁 만이있을 때 당신과 당신의 동료, 당신은 더 특정 작업을 수행하기 위해 함께 일할 수있는 회사처럼.
스레드가 소정의 동작 후, 대기 상태를 (입사 대기를 () )는 지정된 코드의 종료 후, 다른 스레드는 웨이크 후에도 실행 대기 ( 알림 () ) 경우, 대기 다중 스레드있을 때 필요의 notifyAll ()가 모든 대기 스레드를 깨워 사용합니다.
통지 / 대기하는 스레드 간의 협력 메커니즘입니다.
이후 방법에 대기
다음과 같이 웨이크 업 (wake-up) 기다립니다은 세 가지 방법의 사용을 의미 스레드 사이의 통신 문제를 해결하는 데 사용됩니다 :
- 기다릴 : 스레드가 더 이상 더 이상 대기 집합으로, 일정에 참여 활성화, 그럼 대기 상태를 스레드, 잠금 경쟁, CPU 자원을하지 낭비하지 않습니다. 또한 수행하기 위해 다른 스레드를 기다리는 특정 작업을 ", 즉, (알림) 통지 의 스케줄링 큐 (준비 큐)를 다시 입력 명시된 대기에서 스레드의 릴리스가 나올 때까지 기다리는이 개체의"
- 예를 들어, 사용 가능 레스토랑의 위치, 고객이 가장 오래된 먼저 앉아 식사를 기다린 스레드 객체의 대기 세트가 릴리스에서 선택 통지 : 통지합니다.
- 가는 notifyAll : 알림 객체의 대기 세트에있는 모든 스레드가 해제됩니다.
참고 :
단지 대기 스레드를 알려하더라도 스레드는이 장소가 동기화 블록에 중단했기 때문에, 즉시 실행을 재개 통보,하지만 그 순간에 더 이상 잠금을 보유하고, 그래서 그녀는 아마 (다시 잠금을 획득하려고 할 필요가 될 수 없다 성공적인 호출 대기 후 원래 방법 후 장소에서 실행을 다시 시작하기 위해 다른 스레드의 경쟁)에 직면.
다음과 같이 요약 :
- 당신이 잠금을 얻을 수 있다면, 스레드 상태를 기다리고에서 RUNNABLE 상태가된다;
- 그렇지 않으면, 대기에서 밖으로 설정하고 엔트리 세트로, 스레드 상태를 기다리지 및 주 차단된다
대기 전화 및 통지 방법은 세부 사항에주의를 지불 할 필요
- 기다려 방법 방법은 동일한 로크 대상에 의해 호출되어야 통지. 이유는 대응 잠금 객체가 로크 대상으로 대기 메소드 호출 후에 스레드의 사용을 깨우 통지 할 수있다.
- 알리고 대기 방법은 객체의 클래스에 속하는 방법이다. 때문에 : 잠금 객체가 어떤 객체가 될 수 있으며, 클래스에 속하는 모든 객체는 Object 클래스를 상속됩니다.
- 알리고 대기있어서 동기 부호 블록 또는 동기 함수의 방법에 사용되어야한다. 때문에 두 개의 잠금 개체를 통해이 메소드를 호출해야합니다.
/ * 자원 클래스 : 클래스 빵 만두의 속성을 설정합니다 가죽 덫 주 만두 : 거짓, 사실이 아니다 있습니다 * / 공공 클래스 바 오즈 { // 피부 문자열 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 + "만두, 당신은 음식 제품을 먹고 시작할 수 있습니다" ); } } } }
/ * 소비자 (식품 제품) 카테고리 : 스레드 클래스는 스레드를 상속 할 수 있습니다 설정 스레드 작업 (실행) : 롤빵 만두의 상태를 판단하려면 거짓 : 더 롤빵 없다 식품 제품은 대기 상태로 대기 메소드를 호출 사실 : 만두가있다 식품 제품 롤빵 빵 식품 제품을 먹고 상태가 거짓없는 빵 수정 식품 상품 바 오즈 푸 스레드를 깨워, 만두 생산 * / 공공 클래스 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 ( "------------------------------------------- --------- " ); } } } }
/ * 시험 종류 : 그것은 메인 메소드를 포함하는 프로그램을 실행 입구 개시제 만두 객체를 생성하는 단계; 바 오즈 푸 스레드가 생성, 공개, 만두의 생산; 식품 제품 스레드를 열고, 빵을 만들기; * / 공공 클래스 데모 { 공공 정적 무효 메인 (문자열 []에 args) { // 객체 빵 만드는, 바 오즈의 BZ = 새로운 새로운 바 오즈을 (); // 바오 Zipu 스레드 차례, 만두의 생산을 만들고, 새로운 새로운 BaoZiPu (BZ) .start (); // 식품 제품 스레드를 열고, 롤빵을 만들어, 새로운 새로운 ChiHuo (BZ) .start를 (); } }
장 스레드 풀
스레드 풀 아이디어의 2.1 개요
우리가 달성하기 위해,하지만 문제가있을 것입니다 매우 쉽게, 그래서 스레드를 생성하기 위해 스레드를 사용하는 갔을 때 :
많은 동시 스레드의 수, 각 스레드가 매우 짧은 시간에 실행하면 작업이 너무 자주 스레드가 매우 빈번한 쓰레드 생성 및 스레드의 파괴는 시간이 걸린다의 시스템의 효율성을 줄일 생성 끝났습니다.
스레드가 파괴되지 않는 작업을 실행 한 후, 즉, 재사용 할 수 있지만 다른 작업을 계속 수행 할 수 있도록 방법이 있나요?
자바,이 효과는 스레드 풀에 의해 달성 될 수있다. 오늘 우리는 무엇을 자바 스레드 풀 자세히 설명 할 것이다.
2.2 스레드 풀 개념
- 스레드 풀 : 반복적으로 스레드를 생성하고 너무 많은 자원을 소모하지 않고 사실, 스레드가 종종 필요성을 제거, 반복적으로 사용할 수있는 수납 용기 다중 스레드, 스레드 개체 작업을 만듭니다.
스레드 풀 작업의 많은 자원의 최적화에 관련되어 있기 때문에, 우리는 여기가 그들을 반복하지 않는 것입니다. 우리는 어떻게 스레드 풀을 이해하는지도를 전달합니다 :
세 혜택을 가져올 수있는 스레드 풀의 합리적인 사용 :
- 자원 소비를 줄일 수 있습니다. 스레드의 생성과 파괴의 수를 줄이면, 각 작업자 스레드는 여러 작업을 수행 할 수 있습니다, 재사용 할 수 있습니다.
- 응답 속도를 향상시킬 수 있습니다. 미션이 도착하면 작업은 스레드 생성 즉시 구현 될 수있을 때까지 기다릴 필요가 없습니다 수 있습니다.
- 관리 성을 향상 스레드. 서버 (각 스레드가 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)
: 하나 개의 스레드 풀 스레드 개체 가져 오기를 수행미래 인터페이스 : 작업이 완료되면 스레드의 결과를 기록하는 데 사용됩니다. 만들기 및 스레드 풀을 사용하여.
단계 스레드 풀 스레드 개체를 사용 :
- 스레드 풀 개체를 만듭니다.
- 실행 가능한 인터페이스는 하위 개체를 만들 수 있습니다. (작업)
- 의 Runnable 인터페이스 서브 클래스 객체를 제출합니다. (작업을 가지고)
- 스레드 풀을 (일반적으로하지)를 닫습니다.
실행 가능한 구현 클래스 코드 :
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 기능 프로그래밍 아이디어
===================================