>  기사  >  Java  >  Java 스레드 풀의 구성 방법을 구현하는 방법

Java 스레드 풀의 구성 방법을 구현하는 방법

앞으로
2023-04-19 15:13:07732검색

1. 소개

동시 프로그래밍을 구현하기 위해 프로세스라는 개념이 도입되었습니다. 프로세스는 운영 체제의 작업과 동일합니다. 여러 프로세스가 동시에 작업을 실행하므로 동시 프로그래밍이 가능하고 실행 속도가 빨라집니다.

하지만 프로세스가 충분히 가볍지 않기 때문에 프로세스를 생성하고 파괴하는 데 소모되는 리소스를 무시할 수 없습니다. 프로세스 수가 많지 않으면 이러한 리소스 소비는 허용되지만 프로세스가 자주 생성되고 삭제되는 경우입니다. 비용이 많이 듭니다.

우리는 어떻게 해야 할까요?

이 문제를 해결하기 위해 사람들은 더 가벼운 도구인 스레드를 도입했습니다.

스레드는 경량 프로세스라고도 합니다. 생성 및 파괴는 프로세스보다 적은 리소스를 소비합니다. 하지만 작업 수가 많고 멀티스레딩이 빈번한 생성과 소멸을 견딜 수 없다면 어떻게 될까요? 이때 문제를 해결하기 위해 스레드 풀이 나옵니다.

2. 스레드 풀이란?

스레드 풀은 Java 문자열 상수 풀과 유사합니다.

스레드 사용 VS 스레드 사용 안함

  • 스레드를 사용할 때는 풀에서 직접 스레드를 가져오세요.

  • 실이 필요 없을 땐 이 실을 풀에 넣어두세요

취업 과정이 아마 이렇다는 건 다들 아시죠.

  • 이력서 제출

  • 필기시험

  • Interview

  • offer

2가지 상황이 발생합니다.

  • 합격하면 회사에서 전화해서 통보하고 제안을 보내요

  • 불합격하면 일반적으로 회사에서는 불합격 사실을 알리지 않고 합격 사실도 알리지 않습니다. 이는 회사가 귀하를 "인재 예비 풀"에 넣을 수 있기 때문입니다.

회사에서 50명을 찾고 있는데, 가을 모집 기간 동안 50명에게 제안을 보낸다고 가정해 보겠습니다. 그런데 실제로 신고하러 온 사람은 35명에 불과했습니다. 이때 나머지 15명은 인재예비풀에서 15명을 직접 뽑아 직접 제안을 하게 된다.

아마 이때 시간이 좀 지났는데 갑자기 회사에서 전화해서 채용됐다고 알리는 거에요. 이 작업은 풀에서 직접 스레드를 사용하는 것과 같습니다.

이것은 취업 활동을 예로 들어 스레드 풀이 무엇을 의미하는지 설명하기 위한 것입니다.

3. 스레드 풀 구성 방법의 매개변수 ThreadPoolExecutor 구성 방법은 무엇을 의미하나요?

"Alibaba Java 개발 매뉴얼"에서는 스레드 리소스를 스레드 풀을 통해 제공해야 하며 스레드 생성이 애플리케이션에 표시되는 것을 허용하지 않는다고 지적하고 있습니다. 한편으로는 스레드 생성이 더욱 표준화되어 있습니다. 열린 스레드 수는 합리적으로 제어할 수 있습니다. 반면 스레드의 세부적인 관리는 스레드 풀에 의해 처리되어 리소스 오버헤드를 최적화합니다.

"ThreadPoolExecutor" 클래스는 스레드 풀 사용을 위해 Java 표준 라이브러리에서 제공하는 클래스 집합입니다.

ThreadPoolExecutor에는 네 가지 구성 방법이 있습니다. 각각은 서로 다른 매개변수를 포함하며 서로 다른 시나리오에서 사용됩니다.
가장 많은 매개변수를 활용한 시공방법을 소개해드립니다.

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

Java 스레드 풀의 구성 방법을 구현하는 방법

1.corePoolSize 코어 스레드 수

2.maximumPoolSize 최대 스레드 수

코어 스레드 수와 최대 스레드 수가 무엇인지 잘 이해하지 못할 수도 있습니다. 다음은 직원의 예입니다. 출근합니다.

핵심실 갯수는 회사 공식 직원들이 잠시 낚시를 할 수 있게 해주는 갯수입니다. 적발되더라도 해고되지는 않습니다. (아무것도 안해도 망가지지 않는 실풀에 있는 실들과 동일)

최대 실 갯수는 회사 정규직+비정규직 인원수인데, 이곳 비정규직도 낚시를 할 수 있습니다. 일정 기간 동안 해고됩니다. (스레드 풀의 스레드가 파괴되는 것과 동일)

3.keepAliveTime은 임시 직원이 낚시를 할 수 있는 기간을 나타냅니다.

4.unit은 시간 단위로, keepAliveTime의 단위입니다.

5.workQueue 차단 대기열은 스레드 풀에 의해 실행될 작업을 구성합니다

6.threadFactory 스레드 생성 방법, 이 매개변수를 사용하여 다양한 스레드의 생성 방법을 설정합니다

7.RejectedExecutionHandler 핸들러 거부 전략. 작업 대기열이 가득 차고 새 작업이 오면 이때 무엇을 해야 할까요?

(1): 최신 작업이 더 이상 필요하지 않습니다

(2): 가장 오래된 작업이 더 이상 필요하지 않습니다

(3): 차단 및 대기

(4) 열기: 예외 발생

Due ThreadPoolExecutor를 사용하는 것은 최대 7개의 매개변수로 인해 더 복잡해 보입니다. 표준 라이브러리는 프로그래머에게 이러한 목적을 위한 추가 클래스 세트를 제공합니다. 이는 ThreadPoolExecutor의 또 다른 캡슐화 계층과 동일합니다. 由于ThreadPoolExecutor使用起来比较复杂,最多有7个参数。标准库为此又为程序员们提供了一组其他的类。相当于对ThreadPoolExecutor又进行了一层封装。

1.newFixedThreadPool:创建出一个固定线程数量的线程池。

 ExecutorService Service1   =  Executors.newFixedThreadPool (20);

2.newCachedThreadPool:创建出一个数量可变的线程池

ExecutorService Service2   = Executors.newCachedThreadPool ();

3.newSingleThreadExecutor:创建只有一个线程的线程池

ExecutorService Service3  = Executors.newSingleThreadExecutor ();

4.newScheduledThreadPool

1.newFixedThreadPool: 고정된 수의 스레드로 스레드 풀을 만듭니다.

ExecutorService Service4   = Executors.newScheduledThreadPool (20);

2.newCachedThreadPool: 가변 개수의 스레드 풀을 생성합니다

模拟实现一个线程池的核心操作:
.:将任务加到线程池中--submit。
.:使用Worker类描述一个工作线程,Runnable来描述一个任务。
.:创建一个BlockingQueue阻塞队列组织所有任务。
.:每个Worker要做的事情就是不停的从阻塞队列里获取任务并执行。
.:指定线程池中的线程最大数目,如果超过这个数目就不要再继续创建线程了。
3.newSingleThreadExecutor: 단 하나의 스레드
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Created with IntelliJ IDEA.
 *
 
 * @Description: 模拟实现线程池的使用
 */
public class ThreadDemo0327_2 {
    public static void main (String[] args) throws IOException, InterruptedException {
        ThreadPoll threadPoll=new ThreadPoll ();
        for (int i = 0 ; i <10  ; i++) {
            threadPoll.submit (new Runnable () {
                @Override
                public void run () {
                    System.out.println ("hello");
                }
            });
        }
    }
}

class  Worker extends  Thread{
    public   BlockingQueue<Runnable> queue=null;
    public Worker(BlockingQueue<Runnable> queue){
        this.queue=queue;
    }

    @Override
    public void run () {
        //工作线程的具体逻辑
        //需要从阻塞队列中取任务.
        while (true){
            try {
                Runnable command=queue.take ();
                //通过run来执行具体任务
                command.run ();
            }catch (InterruptedException e){
                e.printStackTrace ();
            }
        }
    }
}

class  ThreadPoll{
    //包含一个阻塞队列,用来组织任务
  public   BlockingQueue<Runnable> queue=new LinkedBlockingQueue<> ();

    //这个list就用来存放当前的工作线程.
    public  List<Thread> works=new ArrayList<> ();

    public  int MAX_WORKER_COUNT=10;

    //通过这个方法,把任务加入到线程池中
    //submit不光可以把任务放到阻塞队列中,也可以负责创建线程
    public  void submit(Runnable command) throws IOException, InterruptedException {
        if(works.size ()<MAX_WORKER_COUNT){
            //如果当前工作线程的数量不足线程数目上线,就创建出新的线程
            //工作线程就专门找一个类完成
            //worker内部要哦能够取到队列的内容,就要把这个队列实例通过worker的构造方法传过去
            Worker worker=new Worker (queue);
            worker.start ();
            works.add (worker);
        }
        queue.put (command);
    }
}

4로 스레드 풀을 생성합니다.newScheduledThreadPool: 지연 시간을 설정할 수 있는 스레드 풀을 생성합니다. 🎜rrreee🎜4. 스레드 풀 시뮬레이션 및 구현🎜rrreee🎜🎜코드 구현:🎜🎜

我们创建一个线程池并让它不停的创建进程打印hello

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Created with IntelliJ IDEA.
 *
 
 * @Description: 模拟实现线程池的使用
 */
public class ThreadDemo0327_2 {
    public static void main (String[] args) throws IOException, InterruptedException {
        ThreadPoll threadPoll=new ThreadPoll ();
        for (int i = 0 ; i <10  ; i++) {
            threadPoll.submit (new Runnable () {
                @Override
                public void run () {
                    System.out.println ("hello");
                }
            });
        }
    }
}

class  Worker extends  Thread{
    public   BlockingQueue<Runnable> queue=null;
    public Worker(BlockingQueue<Runnable> queue){
        this.queue=queue;
    }

    @Override
    public void run () {
        //工作线程的具体逻辑
        //需要从阻塞队列中取任务.
        while (true){
            try {
                Runnable command=queue.take ();
                //通过run来执行具体任务
                command.run ();
            }catch (InterruptedException e){
                e.printStackTrace ();
            }
        }
    }
}

class  ThreadPoll{
    //包含一个阻塞队列,用来组织任务
  public   BlockingQueue<Runnable> queue=new LinkedBlockingQueue<> ();

    //这个list就用来存放当前的工作线程.
    public  List<Thread> works=new ArrayList<> ();

    public  int MAX_WORKER_COUNT=10;

    //通过这个方法,把任务加入到线程池中
    //submit不光可以把任务放到阻塞队列中,也可以负责创建线程
    public  void submit(Runnable command) throws IOException, InterruptedException {
        if(works.size ()<MAX_WORKER_COUNT){
            //如果当前工作线程的数量不足线程数目上线,就创建出新的线程
            //工作线程就专门找一个类完成
            //worker内部要哦能够取到队列的内容,就要把这个队列实例通过worker的构造方法传过去
            Worker worker=new Worker (queue);
            worker.start ();
            works.add (worker);
        }
        queue.put (command);
    }
}

运行效果:

可以看到,打印了10个hello。

Java 스레드 풀의 구성 방법을 구현하는 방법

위 내용은 Java 스레드 풀의 구성 방법을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제