자바 멀티 스레딩 및 스레드 풀

1. 현장 설명

아래 그림과 같이 멀티 스레딩은 또한 일반적으로 요약에서, 때문에 다른 페이지에 여러 스레드를 사용의 필요성, 전이 시간을 사용하고, 필요로하는 친구를 참조 할 수 있습니다.

2. 솔루션

2.1 스레드 풀 개념

연못의 개념 (사전 정의)가 작성되어 사전에 다음 스레드가 연못, 이점에서 직접 수행 할 수 있습니다 스레드 풀의 공식 정의는 인기 속담에서, 말할 수 없습니다 :

(1) 실을 재생성하지 않고 자원 소비를 더 생성하는 단계;

(2) 풀 통제되지 않은 방지하기 위해 스레드를 만들 먼저 정의, 예측할 수없는 위험에 시스템을 발생합니다.

2.2 만들기 방법

자신의 스레드 풀, java.util.concurrent의 다음과 같은 패키지로 제공하기 시작 JDK1.5를 JDK 사용하는 방법을 만듭니다.

사실 표면을 생성하는 방법은 두 가지, 한 종류가있다.

(1) 생성 새로운 ThreadPoolExecutor에 사용하는 것이다;

  public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {

(2) Executors.newFixedThreadPool (3)의 사용은하지만, 스레드 풀 또는 호출 사용해, 새로운 ThreadPoolExecutor는 몇 가지 기본 매개 변수 만 할당을 만들 수.

new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());

2.3 정의

일곱 개 매개 변수의 총 :

(1) corePoolSize를

스레드의 현재 수는 아직 수 corePoolSize를 도달하지 않은 경우 태스크가 스레드의 핵심 번호는 커널 스레드를 생성, 와서, 커널 스레드의 특징은 다음과 같습니다

2, 코어 스레드는 일반적으로도 유휴 상태, 파괴되지 않는다; 스레드의 수가 최대 코어 스레드에 도달하지 않은 경우 유휴 스레드가 재사용, 여전히 새로운 스레드의 핵심입니다하지 않습니다이 경우에도 1, 새로운 작업에 와서 방법으로 allowCoreThreadTimeOut (부울 값) true로 설정되어있는 경우이지만, 시간 제한도 파괴 될 것이다 프로덕션 환경을 처음으로 초기화 할 때 3, 당신은 느린 방지하기 위해, 사전에 모든 핵심 스레드를 생성하는 첫 번째 통화를 prestartCoreThread () 메소드를 호출 할 수 있습니다;

(2) maximumPoolSize를

핵심 스레드뿐만 아니라, 핵심 전략은 몇 가지 완전 무료 시간이지만, 또한 작업을 처리 할 수있는 몇 가지 임시 스레드를 만들 스레드, maximumPoolSize를 최대 한계 코어 스레드 + 일시 스레드입니다. 임시 스레드가 건조되지 설정된 유휴 시간 일을 초과, 타임 아웃 메커니즘을 가지고, 그것은 파괴됩니다.

(3)이 KeepAliveTime

이것은 최대 스레드 휴지 시간 인 한 상기 두에서 타임 아웃 파라미터 인 디폴트 비 코어 끈이 allowCoreThreadTimeOut (부울 값) 메소드 세트가 사용되며, 이는 코어 끈 위해 사용될 것이다.

(4) 부

이 KeepAliveTime 초, 분, 시간 등의 상기와이 매개 변수는 특정 시간 제한 유닛

(5)이 Workqueue

작업은 코어 스레드가 대기하지 않고, 새로운 작업이 대기 큐에 배치 될 경우, 실행 대기 큐입니다.

(6) ThreadFactory를

그것은 스레드 이름 형식이 배경 여부 등, 당신이 Executors.defaultThreadFactory을 사용할 수 있습니다, 정의 스레드를 달성 할 수있는 방법을 생성하는 인터페이스 () 디폴트의 구현은 경우, 같은 구아바 자 라이브러리 등의 방법에 의해 달성 될 수있다, 할 수있다 특별한 요구 사항은 당신이 당신의 자신을 정의 할 수 있습니다. 그것은 가장 중요한 장소는 쉽게 그 문제를 해결하기 위해, 스레드 이름 형식의 정의입니다해야합니다.

(7) 핸들러

이 작업을 처리하는 유휴 스레드가 없으며, 큐가 가득 차면 (물론, 이것은 단지 바운드 대기열에 대해 작동), 그리고, 당신은 어떤 절충을에 다음 새 작업이 매개 변수는 정책의 트레이드 오프를 지정하는 동안, 네이 따르고,이 올 수 있습니다 전략의 종류를 선택할 수 있습니다 :

ThreadPoolExecutor.AbortPolicy : 기본 전략입니다 직접 던져 예외;
ThreadPoolExecutor.DiscardPolicy는 : 폐기 작업을하지만, 예외가 발생하지 않습니다.
ThreadPoolExecutor.DiscardOldestPolicy는 : 최초 작업 큐를 폐기하고 대기 큐에 추가 된 새 작업
ThreadPoolExecutor.CallerRunsPolicy : 스레드 풀에서 스레드 곳 등이 정책의 이행이있을 것입니다 경우, 메인 함수에서 스레드 풀을 만드는 것과 처리 작업, 메인 스레드는 작업을 수행 할 수

2.4 시험 확인

2.4.1 테스트 스레드
package com.yutong.laowang.test;

public class ThreadTest extends Thread{
    @Override
    public void run() {
        System.out.println("软件老王:" +Thread.currentThread().getName());
  }
}
2.4.2 실행자 작성
  private static void test4() {
        Executor mExecutor = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            Thread thread = new ThreadTest();
            mExecutor.execute(thread);
        }
    }

결과 :

软件老王:pool-2-thread-2
软件老王:pool-2-thread-3
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-2
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-2
软件老王:pool-2-thread-3
软件老王:pool-2-thread-1
2.4.3 ThreadPoolExecutor에 작성
 private static void test3() {
        int poolSize = 5;
        int queueSize = 100;
        ExecutorService executorService = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(queueSize), new ThreadPoolExecutor.AbortPolicy());
                
        for (int i=0;i<10;i++) {
            executorService.submit(new ThreadTest());
        }
    }

결과 :

软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-4
软件老王:pool-2-thread-2
软件老王:pool-2-thread-5
软件老王:pool-2-thread-5
软件老王:pool-2-thread-1
软件老王:pool-2-thread-2
软件老王:pool-2-thread-2
软件老王:pool-2-thread-1
2.4.4 스레드 비활성화
thread.interrupt();
---有时候不一定能执行成功,一般会结合判断使用,软件老王,例如:
在ThreadTest类中进行判断,默认为false,当满足条件下为true,停用线程。
 public volatile boolean exit = false;

내가 "소프트웨어 바로는,"나는 그게 내가 수도 경우, 다음 노래를 집중할 생각 해요, 이후의 업데이트 초 알고! 오신 것을 환영합니다 포럼, 제 공공 메시지 교환을 이름이 같은 사람!

추천

출처www.cnblogs.com/ruanjianlaowang/p/12014490.html