Message Per Message 모드 (이 작업은 귀하에게 맡겨집니다)
당신이 매우 바쁘면, 회사의 아래층 택배가 있으므로, 당신은 당신이 당신의 일을 계속할 수 있도록 택배를 얻도록 도와 주도록 동료를 맡기십시오.
메시지 당 스레드-메시지 모드에서 메시지의 대의원 끝과 실행 종료는 다른 스레드입니다. 메시지의 대의원 끝은 실행 종료 스레드를 알려줍니다.이 작업은 귀하에게 양도됩니다.
호스트 클래스 :
요청에 대한 스레드를 생성하는 클래스는 주로 새 스레드를 열고, 도우미 핸들을 호출하고, 인쇄 할 텍스트를 전달하는 것입니다.
공개 클래스 호스트 {private final helper helper = new helper (); public void request (최종 int count, final char c) {system.out.println ( "요청 시작"); new Thread () {public void run () {helper.handle (count, c);}}. start (); system.out.println ( "Reques End");}}}}.도우미 수업 :
문자 표시 기능을 제공하고 천천히 메소드 인쇄 시간을 시뮬레이션합니다
공개 클래스 도우미 {public void handper (int count, char c) {system.out.println ( "핸들 메소드 시작"); for (int i = 0; i <count; i ++) {systally (); system.out.print (c);} system.out.println ( ""); System.out.println ( "핸들 메소드 끝"); {Thread.Sleep (100);} Catch (InterruptedException e) {// TODO 자동 생성 캐치 Blocke.printstackTrace ();}}}메인 클래스 :
호스트 인스턴스를 작성하고 요청 방법을 호출하십시오.
public static void main (string [] args) {system.out.println ( "main begin"); host host = new host (); host.request (10, 'a'); host.request (20, 'b'); host.request (30, 'c'); system.out.println ( "main end");};테스트 결과 :
메인 시작
요청 방법이 시작되었습니다
요청 메소드의 끝
요청 방법이 시작되었습니다
요청 메소드의 끝
요청 방법이 시작되었습니다
요청 메소드의 끝
메인 엔드
핸들 메소드를 시작하십시오
핸들 메소드를 시작하십시오
핸들 메소드를 시작하십시오
Bacbacbacbacbacbacbacbacba
핸들 방법의 끝
CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB
핸들 방법의 끝
CCCCCCCCCCC
핸들 방법의 끝
작업 결과에서 요청 메소드가 실행 전에 핸들 메소드가 실행될 때까지 기다리지 않고 핸들 메소드를 호출하고 실행이 끝날 때까지 요청 메소드로 돌아갑니다. 따라서 핸들 메소드에 수행 할 특정 수의 문자를 인쇄하는 작업을 전달하는 요청 메소드와 동일하며, 요청 메소드는 핸들 메소드가 완료되기를 기다리지 않고 바보 메소드에서 다른 문을 실행할 수 있습니다. 이것은 또한 일부 작업이 시간이 소요될 때이 모드에서 새로운 스레드를 시작하여 처리를 수행 할 수 있음을 알려줍니다. 이 모드는 서버에 적용하여 서버의 응답 시간을 줄일 수 있습니다.
프로세스와 스레드를 설명하십시오.
스레드와 프로세스의 가장 큰 차이점은 메모리가 공존하는지 여부입니다.
각 프로세스에는 고유 한 독립 메모리 공간이 있습니다. 프로세스는 승인없이 다른 프로세스의 기억을 읽고 쓸 수 없습니다. 프로세스의 메모리 공간은 서로 독립적이므로 프로세스는 다른 프로세스에 의해 파괴되는 것에 대해 걱정할 필요가 없습니다.
스레드는 공존 할 수 있습니다. 하나의 스레드는 인스턴스에 내용을 작성하고 다른 스레드는 인스턴스의 내용을 읽을 수 있습니다. 여러 스레드가 동일한 인스턴스에 액세스 할 수 있으므로 MUTEX를 올바르게 수행해야합니다.
호스트 디자인 최적화 :
1. java.util.concurrent 패키지 아래의 ThreadFactory 인터페이스를 사용하여 호스트 클래스 설계
공개 클래스 호스트 {public void request (최종 int count, final char c) {system.out.println ( "요청 메소드 시작"); threadfactory.newthread (new Runnable () {@overridepublic void run () {// to auto-auto-rened method stubhelper.handle (count, c);}; 종료 ");}}해당 호스트 인스턴스틱 객체 :
호스트 호스트 = 새 호스트 (executors.defaultThreadFactory ());
이 디자인의 장점은 새로 생성 된 원래 인스턴스 코드가 Java.lang.thread 클래스에 따라 다르며 작성 스레드의 일부를 제어 할 수 없으며 재사용이 적다는 것입니다. ThreadFactory가 해당 클래스의 객체를 저장하고 NewThread 메소드를 호출하여 새 스레드를 작성하는 데 사용되는 경우 스레드 생성이 실현됩니다. 이것은 더 이상 스레드 클래스에 의존하지 않지만 생성자에 전달 된 스레드 factory 객체에 따라 달라지며 스레드 생성을 제어하는 세부 사항을 구현합니다.
java.util.concurrent.executor 인터페이스를 사용하여 호스트 클래스를 재 설계 :
이전 ThreadFactory 인터페이스는 스레드 생성의 세부 사항을 숨기지 만 스레드 생성 작업을 숨기지 않습니다. Executor 인터페이스를 사용하면 스레드 생성 작업도 숨겨집니다.
공개 클래스 호스트 {개인 최종 도우미 도우미 (); 개인 최종 헬퍼 (); 개인 최종 집행자; 공개 호스트 (Executor Executor) {this.executor = executor;} public void request (final int count, final char c) {system.out.println ( "요청 메소드 시작"); Executor.execute (@overrridecute run () {//do void void run () stubhelper.handle (count, c);}}); System.out.println ( "요청 메소드 종료");}}예정된 작업을 구현할 수있는 java.util.concurrent.scheduledExecutorService 클래스를 사용하여 생성되었습니다
공개 클래스 호스트 {private final helper helper = new helper (); 개인 최종 최종 ScheduleDexecutorService ScheduleDexecutorService; public host (scheduledexecutorservice scheduledexecutorservice) {this.scheduledexecutorservice = scheduledExecutorservice;} 공개 void 요청 (최종 CHAR C) {SYTOM.OUGOUT.OUGOUR.OUGOUR.OUGOUR.OUGOUR.OUT. 시작 "); scheduledexecutorservice.schedule (new runnable () {@overridepublic void run () {// todo 자동 생성 메소드 stubHelper.Handle (count, c);}}, 3L, TimeUnit.seconds);"요청 방법 끝 ");}}}}.기본 기능 항목 테스트 :
ScheduleDexecutorService ScheduleDexecutorService = exectors = enucuals.newScheduledThreadPool (5); 호스트 호스트 = 새 호스트 (scheduledExecutorService); try {host.Request (10, 'a'); host.Request (20, 'b'); host.request (30, 'c') blocke.printstacktrace ();} 마지막으로 {scheduledexecutorservice.shutdown (); system.out.println ( "main end");}요약
클라이언트 역할은 호스트 역할의 요청 방법을 호출하며, 요청의 실제 처리는 실행을 위해 도우미 핸들에게 양도됩니다. 그러나 클라이언트가 요청에서 직접 핸들 메소드를 호출하면 실제 작업이 끝날 때까지 핸들 메소드에서 반환 할 수 없습니다. 이렇게하면 요청의 응답 성능이 줄어 듭니다. 따라서 호스트 역할은 클라이언트 역할에서 요청을 처리하는 데 사용되는 새 스레드를 시작하고 스레드가 핸들을 호출하여 요청을하는 스레드가 핸들에서 즉시 돌아올 수 있도록합니다. 이것은 메시지당 스레드 모드입니다.