이전 블로그 게시물은 기본적으로 일부 내용을 Java 동시성으로 요약했습니다. 이 블로그 게시물은 주로 문제로 시작하여 위에서 요약 한 동시 기술을 사용하여 해결할 수 있습니다.
시나리오 시뮬레이션 : 16 로그 레코드 처리, 각 로그 레코드 인쇄 시간은 1 초가 걸립니다. 정상적인 상황에서는이 16 개의 레코드가 완료되면 16 초가 걸립니다. 효율성을 향상시키기 위해 4 개의 스레드를 시작하여 인쇄하여 4 초 안에 인쇄 하여이 데모를 실현할 준비가되었습니다.
이 질문을 먼저 분석 해 봅시다. 이 16 개의 로그 레코드와 관련하여 기본 스레드에서 생성 할 수 있습니다. 이것은 어렵지 않습니다. 핵심은 4 개의 스레드를 시작하여 실행하는 것입니다. 현재 두 가지 아이디어가 있습니다. 하나는 로그 생성과 로그를 인쇄하는 스레드가 논리적으로 분리된다는 것입니다. 다른 하나는 로그 생성과 로그를 인쇄하는 스레드가 논리적으로 분리되지 않는다는 것입니다. 이것은 약간 모호 할 수 있습니다. 이 두 가지 아이디어를 기반으로 구현 된 데모를 작성하겠습니다.
로그 생성 및 로그 인쇄는 논리적으로 분리되어 있습니다.
이것은 두 개의 앞면과 동일합니다. 하나의 앞면은 지속적으로 로그를 생성하고 다른 전면은 지속적으로 로그를 인쇄합니다. 차단 대기열의 사용을 생각하고 차단 대기열에 계속 연결되는 로그를 생성하고 차단 큐에서 계속 얻는 인쇄 로그를 생성 할 것입니다. 차단 큐의 크기는 16 또는 1 직접 설정할 수 있으며, 이는 실행에 영향을 미치지 않습니다. 따라서 Blockingqueue가 사용됩니다. 아래에서 구현 된 데모를 살펴 보겠습니다.
public class practice1 {public static void main (string [] args) {// 블록 큐를 정의하면 큐 크기에는 16 개의 정보 블록 Queue <string> queue = new ArrayBlockingqueue <string> (16); int i = 0; i <4; i ++) {// 4 개의 나사산을 열어서 큐를 막기 위해 큐를 막기 위해 que를 gen니다. void run () {while (true) {try {string log = queue.take.take (); // log parselog get get log parselog (log); // print log} catch (InterpruptedExcept e) {// todo auto-auto-auto-regenated catch blocke.printstacktrace ();}}}}); "시작 ()). (System.CurrentTimeMillis ()/1000)); for (int i = 0; i <16; i ++) {최종 문자열 log = "" +(i +1); // 로그 try {queue.put (log); // blocking queue} catch에 생성 된 로그를 하위 t {// auto eccupted catch에 표시합니다. blocke.printstacktrace ();}}} public static void parselog (String log) {// Log System.out.println을 인쇄하는 방법 (thread.currentThread (). getName () + "---" + log + "---" + (System.CurrentTimeMillis ()); Thread. Second} Catch (InterruptedException e) {// todo auto-auto-auto-auto-receated catch blocke.printstacktrace ();}}}} 이것은 시스템이 작동하는 것과 같습니다. 로그 정보를 인쇄하기 위해 지속적으로 로그를 생성하고 여러 스레드를 지속적으로 열어줍니다. 데모가 작성되고 작동 결과가 게시되지 않았습니다.
로그 생성 및 로그 인쇄는 논리적으로 분리되지 않습니다.
이 아이디어는 내가 로그를 생성 할 때 로그를 인쇄하고 4 개의 스레드로 함께 수행한다는 것입니다! 따라서 이런 식으로 생각하면 스레드 풀을 사용해야합니다. 먼저 4 개의 스레드가 들어있는 스레드 풀을 만들었고 로그가 생성되면 스레드 풀에 스레드를 사용하여 실행하도록 요청했습니다. 데모는 다음과 같습니다.
public class practice1 {public static void main (string [] args) {executorService service = executors.newfixedThreadpool (4); // 스레드 풀 시스템을 만듭니다. service.execute (new Runnable () {// @override public void run () {parselog (log);}});} service.shutdown (); // 끝에서 스레드 풀을 끄는 것을 잊지 마십시오} public static void parselog (string log) {system.out.println (gret.crentthredn ()-getname (). "---" + (System.CurrentTimeMillis ()/1000)); Try {Thread.Sleep (1000); // 로그 인쇄 시뮬레이션 1 초} Catch (InterpruptedException e) {// todo 자동 생성 Catch Blocke.printstackTrace ()}}}이 문제를 여기에서 요약하겠습니다. 이 두 가지 아이디어를 이해하면 일반적으로 효과적으로 해결할 수 있습니다.
위의 내용은 다중 스레드 문제 예제 코드를 프로그래밍하는 Java에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!