EXECUTOR LÀ GÌ

     

Thread Pool Là trong những yếu tố chính ảnh hưởng tới hiệu năng của các chương trình lớn, yên cầu xử lý mặt khác nhiều trách nhiệm cùng lúc.

Bạn đang xem: Executor là gì

Nếu chúng ta chưa rõ Thread vào Java, thì hãy đọc bài này trước:

Thread và xử trí đa luồng trong Java

Một ví dụ dễ dàng nhé (Trong thực tiễn sẽ khác, hãy coi đây là ví dụ nha):

Bây giờ, đưa sử các bạn có một vps Web. Nếu họ nhận 1 request trường đoản cú client, bọn họ sẽ cách xử lý mất 0.5s cùng trả về kết quả cho tất cả những người dùng.

Thế nếu có 2 fan request cùng lúc? => giải quyết bằng phương pháp mỗi một request sẽ xử lý tại 1 thread, solo giản.

Thế nếu có 100 người request cùng lúc? => mọi người tạo một thre... Wait a minute.... (nếu 1 tháng gồm 10M lượt request => tạo ra 10M thread)

Nếu bạn tạo 1-2 thread mới, chả ai trách gì các bạn cả. Nhưng nếu khách hàng tạo thường xuyên và tới hàng trăm cái mới mỗi lần nhưng lại giải quyết và xử lý cùng 1 sự việc thì gồm lỗ hổng đấy. Vì giá thành của việc tạo 1 thread là tương đối lớn, thường xuyên dẫn tới các vấn đề về tính năng và cấp phép dữ liệu.

Với vấn đề xử lý những tác vụ liên tục như vậy, có một chiến thuật là áp dụng Thread Pool.

Ở lấy một ví dụ trên, hiện thời tôi sẽ chỉ sử dụng 30 thread thôi! và đặt 30 thread này sinh hoạt trạng thái không làm gì và bỏ vào 1 chiếc Pool (1 dòng bể chứa, hình trạng vậy). Với từng request đến, tôi vẫn lấy trong Pool ra 1 thread và cách xử lý công việc, giải pháp xử lý xong, thì chứa thread vào ngược trở về pool. Đơn giản vậy thôi, như thế bọn họ sẽ không hẳn tạo bắt đầu Thread nữa. Kiêng tình tốn túi tiền và hiệu năng.

Vấn đề là đưa sử bao gồm hơn 31 request tới cùng lúc thì sao? rất đúng, trường hòa hợp này là chắc chắn có. Hôm nay Pool sẽ không còn thread làm sao sẵn bao gồm nữa. Nên 1 request còn lại có khả năng sẽ bị đẩy vào 1 hàng ngóng BlockingQueue. Nó sẽ ngóng ở đó, bao giờ Pool có một thread nhàn hạ thì sẽ quay trở lại xử lý nốt =))) chịu đựng thôi, cứ ví dụ như vậy hah.

*

Đó là concept của ThreadPool đó các bạn.

Cách tạo ThreadPool vào Java

Java Concurrency API cung ứng một vài một số loại ThreadPool sau:

Cached thread pool: từng nhiệm vụ sẽ tạo nên ra thread mới nếu cần, nhưng sẽ tái thực hiện lại những thread cũ. (Cái này vẫn nguy khốn nhé, nên áp dụng với những task nhỏ, tốn ít tính toán)

Fixed thread pool: giới hạn số lượng tối đa của các Thread được sinh sản ra. Những task khác mang lại sau đề nghị chờ trong hàng hóng (BlockingQueue). (Ví dụ đầu bài)

Single-threaded pool: chỉ giữ lại một Thread thực thi một trách nhiệm một lúc.

Fork/Join pool: một Thread quan trọng sử dụng Fork/ Join Framework bằng cách tự động chia nhỏ dại công việc đo lường cho các core xử lý. (Tính toán tuy vậy song)

Executor

Executor là 1 class đi kèm theo trong gói java.util.concurrent, là một đối tượng người tiêu dùng chịu trách nhiệm cai quản các luồng và tiến hành các tác vụ Runnable được yêu mong xử lý. Nó bóc tách riêng các chi tiết của câu hỏi tạo Thread, lập kế hoạch (scheduling), … để bạn cũng có thể tập trung phát triển logic của tác vụ mà không cân nhắc các chi tiết thống trị Thread.

Xem thêm: Tại Sao Nên Ăn Bao Nhiêu Cà Chua 1 Ngày Là Đủ Để Không Mập? Câu Trả Lời Sẽ Khiến Bạn Bất Ngờ

*

Nói bình thường nó là thằng wrapper các quá trình mình nói làm việc trên, và thống trị hộ bọn chúng ta.

Chúng có thể tạo một Executor bằng phương pháp sử dụng một trong số phương thức được cung cấp bởi lớp phầm mềm Executors như sau:

newSingleThreadExecutor(): trong ThreadPool chỉ có một Thread và những task (nhiệm vụ) sẽ tiến hành xử lý một bí quyết tuần tự.

newCachedThreadPool(): như giải thích ở trên, nó sẽ có 1 số lượng nhất định thread để thực hiện lại, dẫu vậy vẫn sẽ khởi tạo mới thread ví như cần. Khoác định giả dụ một Thread không được sử dụng trong vòng 60 giây thì Thread đó có khả năng sẽ bị tắt.

newFixedThreadPool(int n): trong Pool chỉ có n Thread để xử trí nhiệm vụ, các yêu cầu tới sau bị đẩy vào hàng đợi

newScheduledThreadPool(int corePoolSize): tương tự như như newCachedThreadPool() nhưng sẽ có thời gian delay giữa các Thread.

newSingleThreadScheduledExecutor(): tương tự như như newSingleThreadExecutor() nhưng sẽ có khoảng thời gian delay giữa những Thread.

Code chạy thử

Chúng ta đã lấy lấy ví dụ đầu bài để code luôn nhé.

Tạo một class implement Runnable để cách xử lý request đến. (phân biệt Runnable và Thread nhé các bạn)

public class RequestHandler implements Runnable String name; public RequestHandler(String name) this.name = name;
Override public void run() try // bước đầu xử lý request đến System.out.println(Thread.currentThread().getName() + " Starting process " + name); // cho ngủ 500 milis để ví dụ là quá trình xử lý mất 0,5 s Thread.sleep(500); // ngừng xử lý request System.out.println(Thread.currentThread().getName() + " Finished process " + name); catch (InterruptedException e) e.printStackTrace();

newSingleThreadExecutor

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SingleThreadPoolExample { public static void main(String<> args) { ExecutorService executor = Executors.newSingleThreadExecutor(); // có 100 request tới cùng lúc for (int i = 0; i Cả công tác chỉ có 1 pool, 1 thread duy nhất, xử lý toàn cục request đến. Chiếc nào đến sau thì đợi thôi.

newFixedThreadPool()

public class FixedThreadPoolExample { public static void main(String<> args) throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(5); // tất cả 100 request tới đồng thời for (int i = 0; i nhiều loại này thì bọn họ cố định 5 thread, với nó cử mặc định vì vậy mà xài thôi, thiếu thread thì đề nghị chờ tới khi có

newCachedThreadPool()

public class CachedThreadPoolExample { public static void main(String<> args) throws InterruptedException { ExecutorService executor = Executors.newCachedThreadPool(); // có 100 request tới đồng thời for (int i = 0; i tất cả chút khởi sắc, lịch trình chạy cấp tốc hơn hẳn. Vì chưng nó được chế tạo số thread thoải mái và dễ chịu nếu nên :)))) hết sức nguy hiểm. Nhưng bạn sẽ thấy là gồm chỗ nó thực hiện lại những thread đã dứt trước đó.

Xem thêm: Cách Làm Bánh Cuốn Bằng Bột Mì Và Bột Pha Sẵn, Cách Lựa Chọn Bột Bánh Cuốn Chuẩn Nhất

Bài viết tiếp đây kết thúc, Đây là 1 kiến thức rất quan trọng đặc biệt nên các bạn cố gắng nắm rõ nhé.