Top 3 # Xem Nhiều Nhất Tìm Hiểu Về Hibernate Trong Java Mới Nhất 1/2023 # Top Like | Cuocthitainang2010.com

Tìm Hiểu Hibernate Là Gì: Câu Hỏi Phỏng Vấn Hibernate Trong Java

nhà phát triển Java.

Câu hỏi Hibernate cơ bản

Phần đầu tiên của hướng dẫn này đề cập đến một số câu hỏi đơn giản như Hibernate là gì? Đây là những ví dụ về các câu hỏi có thể nhận được khi bắt đầu cuộc phỏng vấn xin việc hoặc nếu Hibernate framework không phải là framework chính mà nhà tuyển dụng đang tìm kiếm. Mặc dù vậy, điều quan trọng là phải biết những câu hỏi và câu trả lời, vì chúng có thể là yếu tố quyết định cho sự thành công hay thất bại của buổi phỏng vấn.

Câu hỏi 1: Hibernate là gì?

Một câu hỏi đầu tiên khá tuyệt vời mà bạn có thể nhận được trong cuộc phỏng vấn xin việc, nhà tuyển dụng sẽ kiểm tra kỹ năng của bạn trong việc trình bày ý hiểu về Hibernate là gì. Bạn có thể gặp phải các câu hỏi phỏng vấn Hibernate tương tự đó là những câu hỏi giải thích một khái niệm hoặc định nghĩa một cái gì đó.

Vậy Hibernate là gì? Hibernate là dựa trên Java . Nó được thiết kế để tạo các ứng dụng dựa trên cơ sở dữ liệu. Một tính năng tuyệt vời của khung framework (cũng là một trong những tính năng chính mà nó được yêu thích) là nó đại diện cho cơ sở dữ liệu dưới dạng các đối tượng. Các đối tượng này sau đó có thể được viết mà không cần bất kỳ kiến ​​thức SQL cụ thể nào. Điều này thật tuyệt vời vì nó giúp các nhà phát triển và lập trình viên tiết kiệm rất nhiều thời gian – một thứ có giá trị rất lớn khi nói đến lập trình! Hibernate cũng có object mapping (ánh xạ đối tượng) sẵn có – điều này giảm thiểu số lượng dòng mã code cần thiết cho các ứng dụng hoạt động. Đây chính là câu trả lời để giúp bạn hiểu Hibernate là gì? Hãy nắm chắc kiến thức căn bản này.

Câu hỏi 2: JPA là gì?

JPI là viết tắt của Java Persistence API. Nó cung cấp một đặc tả để quản lý dữ liệu quan hệ trong ứng dụng. Thông số kỹ thuật Java được xác định với các chú thích trong gói javax.persistence. Sử dụng JPA giúp viết mã code được thực hiện độc lập. Biết được các thuật ngữ được viết tắt nhiều nhất có thể là một điều vô cùng quan trọng mà bạn cần chuẩn bị trong các câu hỏi phỏng vấn Hibernate, chúng sẽ giúp ích rất nhiều.

Câu hỏi 3: Criteria API là gì?

Criteria là một API mạnh mẽ, dễ sử dụng và được sử dụng để truy xuất các thực thể thông qua thành phần đối tượng tiêu chuẩn (criteria).

Câu hỏi 4: ‘ORM’ là gì?

ORM là từ viết tắt của “object-related Mapping “. Nó nhằm mục đích làm cho thao tác và truy cập dữ liệu đơn giản nhất có thể bằng cách mapping object (đối tượng ánh xạ) theo dữ liệu của chúng. Đó là khái niệm rất cơ bản mà Hibernate được xây dựng dựa trên và có nguồn gốc từ Java (là ngôn ngữ lập trình hướng đối tượng).

Câu hỏi 5: Lợi ích của Hibernate.

Hibernate framework cung cấp rất nhiều lợi ích cho các nhà phát triển và lập trình viên, vì vậy có khá nhiều lợi ích từ việc hiểu rõ Hibernate là gì. Tuy nhiên, đây chỉ là một vài trong số những lợi ích đáng chú ý như: hỗ trợ các chú thích JPA và XML, hướng đối tượng đầy đủ, dễ dàng tích hợp với các khung framework Java khác nhau, tạo khóa tự động.

Câu hỏi 6: Cú pháp để tạo truy vấn SQL là gì?

Để tạo một truy vấn SQL trong Hibernate, bạn sẽ phải sử dụng dòng cú pháp này:

Câu hỏi 7: ‘dialect’ là gì?

Một dialect (phương ngữ) có thể là một tệp duy nhất hoặc một nhóm các tệp (nhóm các file là trường hợp phổ biến hơn). Các tệp này được sử dụng để kết nối cơ sở dữ liệu Hibernate với lớp Java . Cũng có thể nói rằng phương ngữ giống như “công cụ dịch thuật” của Viking giữa Hibernate và cơ sở dữ liệu cốt lõi của nó.

Câu hỏi 8: Các tài liệu mapping nằm ở đâu trong Hibernate framework?

Tất cả các tài liệu ánh xạ (mapping document) của Hibernate framework đều nằm trong Configuration Interface (Giao diện cấu hình). Giao diện này được sử dụng để lưu trữ các tài liệu được đề cập trước đó và các lệnh cấu hình dành riêng cho vấn đề cho chính framework.

Câu hỏi 9: Tăng cường chức năng của các giao diện tích hợp bằng cách thêm các giao diện tùy chỉnh mới như thế nào?

Người dùng có thể sử dụng các extension interface (giao diện mở rộng) để thêm bất kỳ chức năng cần thiết nào không mà được hỗ trợ bởi các built-in interface ( giao diện tích hợp).

Câu 10: Liệt kê ba trong số các thành phần chính của Hibernate.

Ngoài việc hiểu Hibernate là gì ra thì bạn cần phải nắm được các thành phần của framework này. Sẽ có nhiều hơn ba thành phần để lựa chọn, vì vậy đây là câu hỏi thực sự sẽ giúp bạn ăn điểm dễ dàng. Như một ví dụ trong các câu hỏi phỏng vấn Hibernate, bạn có thể trả lời là: session (phiên), configuration (cấu hình) và query (truy vấn).

Câu hỏi 11: Tệp cấu hình Hibernate là gì?

Tệp cấu hình chứa cơ sở dữ liệu về các cấu hình cụ thể và được sử dụng để khởi tạo SessionFactory. Trong tệp cấu hình XML, người dùng cung cấp thông tin cơ sở dữ liệu hoặc thông tin tài nguyên JNDI (Java Naming and Directory Interface – Giao diện đặt tên và giao diện thư mục). Phần quan trọng khác của tệp cấu hình Hibernate là thông tin Dialect. Đây là thông tin cho phép Hibernate biết loại cơ sở dữ liệu, tệp ánh xạ hoặc chi tiết lớp.

Câu hỏi 12: ‘Hibernate Session’ là gì?

Session (phiên) là công cụ chính mà hoạt động cơ sở dữ liệu trong Hibernate framework. Nó là công cụ chính được sử dụng để tạo, phát hành và thực hiện các truy vấn dựa trên SQL và HQL.

Câu hỏi 13: Làm thế nào để cấu hình Hibernate?

Bên cạnh hiểu rõ các khái niệm cơ bản như Hibernate Java là gì thì làm thế nào để cấu hình framework này cũng vô cùng quan trọng. Câu trả lời ngay lập tức là có hai cách chính để làm như vậy – sử dụng XML và sau đó là annotation (chú thích) do Java cung cấp.

Trong các phiên bản Hibernate trước Hibernate 4.0, cách duy nhất để cấu hình Hibernate framework là sử dụng XML. Tùy chọn để làm như vậy với các chú thích dựa trên Java chỉ có sẵn trong các phiên bản 4.0 trở lên. Đó là lý do tại sao bạn nên lắng nghe cẩn thận các câu hỏi phỏng vấn Hibernate mà nhà tuyển dụng đưa ra – họ có chỉ định phiên bản của framework hay không? Họ đang nói về phiên bản nào? Cách trả lời tốt nhất là nêu cả hai phương pháp cấu hình có thể và sau đó trả lời thêm – nhà tuyển dụng có thể sẽ khá ấn tượng đó!

Câu hỏi 14: Thêm một tiêu chí vào truy vấn SQL với cú pháp là gì?

Cú pháp sẽ như sau:

Session.createCriteria

Câu hỏi 15: Hai bộ sưu tập trong Hibernate là gì?

Hai bộ sưu tập của Hibernate được Sorted và Order.

Câu hỏi phỏng vấn nâng cao

Mặc dù vậy, đừng quá lo lắng – những câu hỏi phỏng vấn Hibernate này được cho là nâng cao hơn vì chúng có thể yêu cầu một câu trả lời sâu hơn hoặc giải thích kỹ hơn ngoài việc trình bày lý thuyết như JPI hay Hibernate là gì.

Câu hỏi 1: Liệt kê một số ưu điểm mà Hibernate có trên JDBC.

JDBC (Java Database Connection) là viết tắt của Kết nối cơ sở dữ liệu Java . Hibernate có khá nhiều lợi thế so với JDBC, với một số điểm đáng chú ý hơn như: không cần tải xuống trình điều khiển mới khi thay đổi cơ sở dữ liệu, hiểu cả SQL và HQL (JDBC chỉ có thể sử dụng SQL), trình điều khiển được tải sẵn, v.v.

Câu hỏi 2: ‘SessionFactory’ là gì?

Hãy cẩn thận nếu không bạn sẽ nhầm lẫn với Session (Phiên)! SessionFactory cung cấp các phiên bản của Phiên. Tất cả dữ liệu và thông tin không mặc định trên Hibernate trong Java được lưu trong SessionFactory.

Câu hỏi 3: Mục đích của ‘caching’ trong Hibernate là gì?

Trong Hibernate, caching (bộ nhớ đệm) cho phép chạy ứng dụng nhanh hơn nhiều. Bộ nhớ đệm làm giảm số lượng truy vấn cần thiết để chạy ứng dụng thành công, do đó tăng tốc độ và tốc độ hiệu suất.

Câu hỏi 4: Có nên sử dụng POJO trong Hibernate?

Đây là câu hỏi có thể được phân loại vào trong những câu hỏi phỏng vấn Hibernate trong Java kép vì trước tiên bạn sẽ cần biết POJO là gì để trả lời chính xác câu hỏi.

POJO ( Plain Old Java Object) là viết tắt của một đối tượng Java cũ đơn giản . Đây là những đối tượng không yêu cầu một đường dẫn cụ thể, do đó không bị hạn chế dưới bất kỳ hình thức, hình dạng hoặc hình thức nào. Bạn nên sử dụng POJO trong các dự án Hibernate của mình – vì chúng sẽ cung cấp mã code hoạt động tốt hơn, trôi chảy hơn khi so sánh với một lớp Java tiêu chuẩn.

Câu hỏi 5: Giải thích ‘persistent classes’ trong Hibernate.

Persistent classes (Các lớp liên tục) là các lớp Java lưu trữ dữ liệu (các đối tượng) của chúng trong các bảng của cơ sở dữ liệu của Hibernate framework. Chúng đặc biệt ở chỗ là cần một hàm tạo để hoạt động như bình thường. Proxy – một số chức năng Hibernate cốt lõi – phụ thuộc rất nhiều vào quy trình làm việc của các lớp liên tục.

Câu hỏi 6: Có nên sử dụng các mẫu Hibernate mặc định không?

Mặc dù đây có thể được coi là một trong những câu hỏi phỏng vấn Hibernate mang tính chủ quan hơn không như những câu nêu định nghĩa như Hibernate Java là gì, nhưng nhà tuyển dụng có thể đang cố xem bạn có biết những ưu điểm chung của việc sử dụng các mẫu Hibernate hay không.

Một trong những lợi thế của việc sử dụng các mẫu Hibernate là rất nhiều chức năng được tự động hóa hoàn toàn (Đóng phiên, xử lý một số ngoại lệ nhất định) – bạn sẽ phải phát hành và thực hiện chúng theo cách thủ công. Ngoài ra, các mẫu này sẽ đơn giản hóa rất nhiều quá trình sử dụng Hibernate.

Câu hỏi 7: Có thể triển khai ‘Join’ vào Hibernate bằng cách sử dụng SQL không?

Câu trả lời là có – có thể sử dụng cả truy vấn SQL và HQL để triển khai Join vào Hibernate.

Câu hỏi 8: Liệt kê và xác định ba trạng thái của các đối tượng trong Hibernate.

Đây được xem là một trong những câu hỏi phỏng vấn Hibernate mở rộng, tổng cộng có ba trạng thái đối tượng – detached, persistent và transient.

Các đối tượng trở nên detached ( tách rời) sau khi phiên được đóng bởi nhà phát triển. Các đối tượng tách rời sau đó có thể biến thành các đối tượng ổn định với các phương thức thích hợp được kích hoạt. Các đối tượng persistent ( liên tục) là những đối tượng đang mở – chúng xảy ra bất cứ khi nào bạn lưu hoặc truy xuất một số trường hợp nhất định từ cơ sở dữ liệu Hibernate. Cá c đối tượng transient (không ổn định) là những “đối tượng lẻ” – vừa được tạo và chưa được phân biệt bởi một Phiên cụ thể.

Câu hỏi 9: Nêu tên bộ nhớ đệm mặc định trong Hibernate.

Bộ nhớ đệm mặc định của Hibernate framework là EHCache.

Câu hỏi 10: Lợi ích chính của plugin Eclipse là gì?

Plugin giúp các nhà phát triển viết và quản lý các tệp một cách dễ dàng hơn nhiều khi so sánh với các phương thức Hibernate mặc định.

Kết quả tìm kiếm xu hướng nhất

Kết luận

Như vậy, chúng tôi đã đề cập đến cả những điều cơ bản như Hibernate là gì và những câu hỏi phỏng vấn Hibernate trong Java cho các nhà phát triển và lập trình viên có kinh nghiệm. Với hướng dẫn này, tôi hy vọng bạn đã có nắm được những câu hỏi từ cơ bản đến nâng cao trong cuộc phỏng vấn việc làm Hibernate. Hãy nhớ rằng – Có công mài sắt có ngày nên kim! Cố gắng đừng căng thẳng quá nhiều và chỉ đơn giản là học – điều đó sẽ tăng cơ hội vô cùng lớn để có được vị trí công việc đáng mơ ước.

Với kiến ​​thức về Hibernate là gì, cách sử dụng Hibernate thì bạn vừa có thể tăng cơ hội có được một công việc lương cao và hỗ trợ bản thân trong các dự án cá nhân trong tương lai. Hiển nhiên là đại đa số những người học Hibernate sẽ làm như vậy bởi vì họ muốn kiếm được công việc tuyệt vời đó. Và tại sao họ không làm như vậy chứ! Một mức lương ổn định ở mức trên trung bình, điều kiện làm việc tuyệt vời, cơ hội nghề nghiệp trong tương lai – ai sẽ không muốn điều đó?

Tìm Hiểu Về Biến Trong Java

Biến là một khái niệm chung chắc chắn bạn đã biết khi học toán từ nhỏ. Biến trong lập trình, cụ thể là biến trong lập trình Java cũng tương tự nhưng có một số khác biệt.

Bạn có thể hiểu một biến là một thùng chứa giá trị trong khi chương trình java được thực thi. Một biến được gán với một kiểu dữ liệu.

Biến là tên của vị trí bộ nhớ. Có ba loại biến trong Java:

Có hai loại kiểu dữ liệu trong java:

Biến (Variable) trong JAVA

Khái niệm: Biến là tên của khu vực dành riêng được phân bổ trong bộ nhớ. Nói cách khác, đó là một tên của vị trí bộ nhớ. Nó là sự kết hợp của “vary + able” có nghĩa là giá trị của nó có thể được thay đổi.

Ví dụ:

int data = 50;

Các loại biến trong JAVA

Có ba loại biến trong JAVA:

local variable

instance variable

static variable

1. Local variable (Biến cục bộ)

Một biến được khai báo bên trong phần thân của phương thức được gọi là biến cục bộ. Bạn chỉ có thể sử dụng biến này trong phương thức đó và các phương thức khác trong class thậm chí không biết rằng biến đó tồn tại.

Một biến cục bộ không thể được định nghĩa bằng từ khóa ‘static’.

2. Instance variable

Một biến được khai báo bên trong class nhưng bên ngoài phần thân của phương thức, được gọi là Instance variable. Nó không được khai báo là static.

Instance variable được gọi là biến đối tượng vì giá trị của nó là cụ thể và không được chia sẻ giữa các thể hiện.

3. Static variable (Biến tĩnh)

Một biến được khai báo là static được gọi là biến tĩnh. Nó không thể là local. Bạn có thể tạo một bản sao của biến tĩnh và chia sẻ giữa tất cả các thể hiện của class.

Cấp phát bộ nhớ cho biến tĩnh chỉ xảy ra một lần khi class được load trong bộ nhớ.

Ví dụ để hiểu các loại biến trong java

Ví dụ 1:

class A{ int data = 50;

Ví dụ về biến Java: Cộng hai số

class Simple{ public static void main(String[] args){ int a = 10; int b = 10; int c = a+b; System.out.println(c);

Kết quả:

Ví dụ về biến Java: Mở rộng

class Simple{ public static void main(String[] args){ int a = 10; float f = a; System.out.println(a); System.out.println(f); } }

Kết quả:

Ví dụ về biến Java: Thu hẹp (typecasting)

class Simple{ public static void main(String[] args){ float f = 10.5f;

Kết quả:

Ví dụ về biến Java: Overflow (tràn)

class Simple{ public static void main(String[] args){

Kết quả:

Ví dụ về biến Java: Cộng kiểu thấp hơn

class Simple{ public static void main(String[] args){ byte a = 10; byte b = 10;

Kết quả:

Lời kết

Tìm Hiểu Về Thread Pool Trong Java

Thread được sinh ra để thực hiện một nhiệm vụ cụ thể, nhiều Thread cùng xử lý công việc giúp chúng ta giải quyết được bài toán thời gian và hiệu năng khi xử lý một tác vụ nào đó.

Bài toán đặt ra ở đây là có phải cứ sinh ra nhiều Thread thì tác vụ của chúng ta sẽ nhanh hơn mượt mà hơn?

Để giải quyết bài toán đó ThreadPool ra đời để giới hạn số lượng Thread được chạy bên trong ứng dụng chúng ta cùng một thời điểm.

Ví dụ: Khi chúng ta viết chương trình tải các tập tin từ Internet, mỗi tập tin cần 1 Thread để thực hiện quá trình tải, giả sử cần tải 10000 tệp âm thanh thì chúng ta phải cần tới 10000 Thread hoạt động cùng một thời điểm trong cùng một chương trình. Điều này sẽ dễ dẫn đến lỗi quá tải của chương trình, làm ảnh hưởng đến bộ nhớ và hiệu suất của chương trình sẽ rất dễ dẫn đến bị crash vì khó kiểm soát.

Vì vậy, để khắc phục hiện tượng này, Java cho phép chúng ta thay vì phải tạo mới Thread cho mỗi nhiệm vụ, quá trình được thực hiện trong cùng một thời điểm thì các nhiệm vụ, quá trình đó có thể được đưa vào trong một ThreadPool để khi trong ThreadPool có bất kỳ Thread nào đang không phải thực hiện một nhiệm vụ nào thì sẽ có nhiệm vụ gán vào một trong số các Thread đó để thực thi. Điều này sẽ giúp khắc phục được sự tắc nghẽn và chương trình sẽ kiểm soát được các luồng thực thi.

Bên trong ThreadPool, các nhiệm vụ sẽ được chèn vào trong một Blocking Queue. Blocking Queue có thể hiểu là nơi chứa các nhiệm vụ mà các Thread sẽ lấy chúng ra và thực thi lần lượt. Mỗi khi có một nhiệm vụ mới được thêm vào Queue và sau đó sẽ chỉ có một Thread đang không phải thực hiện một nhiệm vụ nào vào Queue lấy nhiệm vụ đó ra, còn các Thread còn lại phải chờ đợi cho đến khi Thread đó lấy nhiệm vụ ra thành công.

Nhưng cũng thật là may, bắt đầu từ** Java 5**, chúng ta đã được cung cấp một thư viên “Executor framework” trong gói java.util.concurrent giúp cho lập trình viên tạo và quản lý các ” ThreadPool” và ” Thread Factories” đơn giản hơn bao giờ hết. Java cung cấp cho chúng ta lớp Executor, sub-interface của nó là ExecutorService và lớp ThreadPoolExecutor kế thừa từ interface ExecutorService trên.

Ở đây chúng ta có thể thấy rằng các đối tượng ThreadPool Executor chấp nhận Runnable và đặt nó vào một Runnable Queue. Hàng đợi này đại diện cho tất cả các nhiệm vụ được gửi để được thực thi bởi Threadpool. Bản thân ThreadPool nó là một chuỗi các luồng đang chờ để kéo Runnables ra khỏi hàng đợi và thực hiện chúng theo các phương thức run() riêng của chúng . Khi ThreadPool running, hay nói cách khác, các luồng trong ThreadPool vẫn còn sống và sẵn sàng thực thi runnables. Khi có một Runnable mới trong hàng đợi, một trong các luồng sẽ kéo nó ra và gọi phương thức run() của Runnable.

2.1. Ví dụ

Run.java

public class Run implements Runnable{ int id; public Run(int id) { chúng tôi = id; } @Override public void run() { System.out.println("Tiến trình đang được thực thi " + id); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Tiến trình đã được thực thi" + id); } }

2.2. Cách hoạt động của ThreadPoolExecutor

Giải thích hoạt động của chương trình trên

Trong dòng code khởi tạo ThreadPoolExecutor:

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAlive, unit, workQueue, handler);

chúng ta có 6 tham số:

Đối số 1: (corePoolSize) là số lượng Thread tối thiểu trong ThreadPool. Khi khởi tạo, số lượng Thread có thể là 0. Khi nhiệm vụ được thêm vào thì Thread mới được tạo ra và kể từ đây, nếu số lượng Thread ít hơn corePoolSize thì những Thread mới sẽ được tạo ra đến khi số Thread bằng giá trị của corePoolSize.

Đối số 2: (maximumPoolSize) là số lượng tối đa các Thread trong ThreadPool.

Đối số 3: (keepAliveTime): khi số Thread lớn hơn corePoolSize thì keepAliveTime là thời gian tối đa mà 1 Thread “nhàn rỗi” chờ nhiệm vụ. Khi hết thời gian chờ mà Thread đó chưa có nhiệm vụ thì nó sẽ bị hủy.

Đối số 4: (unit) là đơn vị thời gian của keepAliveTime. Trong ví dụ này thì unit của tôi là TimeUnit.SECONDS.

Đối số 5: (workQueue) là hàng đợi dùng để chứa các nhiệm vụ mà các Thread sẽ lấy chúng ra và thực thi lần lượt, ở đây tôi dùng ArrayBlockingQueue.

Đối số 6: (handler): Hành động khi một request (task) bị từ chối (rejected)

ThreadPoolExecutor.AbortPolicy: Khi một task bị từ chối chương trình sẽ throw ra một runtime RejectedExecutionException.

ThreadPoolExecutor.DiscardPolicy: Khi một task bị từ chối nó đơn gian là sẽ bị “bỏ qua” (discard), lỗi lầm gì đó cũng sẽ không bị throw ra.

ThreadPoolExecutor.DiscardOldestPolicy: Khi một task bị từ chối, chương trình sẽ hủy task “cũ nhất” (oldest) trong queue mà chưa được sử lý, sau đó gửi task vừa bị từ chối vô queue và cố gắng sử lý lại task đó.

Kể từ Java 5 trở đi, ThreadPool đã được xây dựng sẵn trong gói java.util.concurrent, vì vậy chúng ta không cần phải tạo một ThreadPool mà thay vào đó chúng ta sẽ sử dụng các lớp có sẵn của gói này. Java cung cấp cho chúng ta lớp Executor, interface của lớp Executor là ExecutorService. Interface ExecutorService đại diện cho cơ chế thực thi bất đồng bộ có khả năng thực thi các nhiệm vụ trong background. ExecutorService là một đối tượng chịu trách nhiệm quản lý các luồng và thực hiện các tác vụ Runnable được yêu cầu xử lý. Nó tách riêng các chi tiết của việc tạo Thread, lập kế hoạch (scheduling), … để chúng ta có thể tập trung phát triển logic của tác vụ mà không quan tâm đến các chi tiết quản lý Thread.

3.1. Ví dụ

Run.java

public class Run implements Runnable{ int id; public Run(int id) { chúng tôi = id; } @Override public void run() { System.out.println("Tiến trình đang được thực thi " + id); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Tiến trình đã được thực thi" + id); } }

TestThreadPool.java

public class TestThreadPool { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { pool.submit(new Run(i)); } try { pool.awaitTermination(1, TimeUnit.DAYS); } catch (InterruptedException e) { e.printStackTrace(); } pool.shutdown(); } }

3.2. Cách tạo ExecutorService

Ta có thể tạo các thread pool thông qua ExecutorService, các ” tác vụ ” (task) sẽ gửi vào pool và sẽ được sử lý bằng một trong những phương thức mà Executor cung cấp như sau:

Single Thread Executor : Trong ThreadPool chỉ có 1 Thread và các task sẽ được sử lý một cách tuần tự. Tên method “newSingleThreadExecutor()”

Cached ThreadPool : Trong ThreadPool sẽ có rất nhiều Thread, và các task sẽ được sử lý một cách song song. Các Thread cũ sau khi sử lý xong sẽ được sử dụng lại cho tác vụ mới. Mặc định nếu một Thread không được sử dụng trong vào 60 giây thì Thread đó sẽ được hủy (shut down). Tên method “newCachedThreadPool()”

Fixed Thread Pool : Trong ThreadPool sẽ được cố định (fixed) số lượng các Thread. Nếu một task mới được đưa vào mà các thread đều đang “bận rộn” thì task đó sẽ được gửi vào Blocking Queue và ngay sau khi một Thread đã thực thi xong nhiệm vụ của nó thì nhiệm vụ đang ở trong Queue đó sẽ được push ra khỏi Queue và được Thread đó xử lý tiếp. Method “newFixedThreadPool()”

Scheduled Thread Pool : Tương tự như “Cached Thread Pool” nhưng sẽ có khoảng delay giữa các Thread. Method “newScheduledThreadPool()”

Single Thread Scheduled Pool : Tương tự như “Single Thread Executor” nhưng sẽ có khoảng delay giữa các Thread. Method “newSingleThreadScheduledExecutor()”

3.3. Cách sử dụng ExecutorService

Có một vài cách khác nhau để giao nhiệm vụ tới một ExecutorService:

execute(Runnable)

submit(Runnable)

submit(Callable)

invokeAny(…)

execute(Runnable) Phươngthức execute(Runnable) đưa vào một đối tượng java.lang.Runnable và thực thi chúng bất đồng bộ. Với việc sử dụng phương thức này không có cách nào để thu được kết quả của việc thực hiện Runnable (k có callback hoặc giá trị trả về khi thực hiện xong nhiệm vụ).

executorService.execute(new Runnable() { public void run() { System.out.println("Asynchronous task"); } }); executorService.shutdown();

submit(Runnable) Phương thức submit(Runnable) cũng đưa vào 1 Runnable nhưng nó trả về một đối tượng Future. Đối tượng Future có thể được sử dụng để kiểm tra nếu Runnable đã hoàn tất việc thực thi.

submit(Callable) Phương thức submit(Callable) tương tự như submit(Runnable) ngoại trừ việc hàm call() của nó cần 1 giá trị trả về để xác định kết quả thu được sau khi hòan thành nhiệm vụ còn phương thức Runnable.run()không thể trả lại kết quả. Kết quả của Callable có thể thu được thông qua đối tượng Future được trả về bởi phương thức submit(Callable)

Sử dụng phương thức future.get() để thu được kết quả. Chú ý phương thực này được thực thi đồng bộ (Asynchronous – tức là sau khi callable hòan thành nhiệm vụ kết quả được trả về nó mới được thực thi).

Nếu 1 trong số task hòan thành (hoặc ném ra 1 ngoại lệ), phần còn lại của Callable sẽ được hủy bỏ (cancelled).

Đoạn mã trên sẽ in ra các kết quả được trả về từ 1 trong những Callable trong tập hợp. Chạy nó vài lần bạn sẽ nhận được những kết quả khác nhau.

Hãy nhớ rằng một công việc có thể hòan thành do một ngoại lệ, vì vậy có nghĩa nó có thể không “thành công” nhiệm vụ. Không có cách nào để biết sự khác biệt trên đối tượng Future.

3.4. Cách kết thúc ExecutorService

shutdown() Khi bạn đã thêm vào các nhiệm vụ cần thiết bạn nên tắt ExcutorService bằng phương thức shutdown(). Khi bạn gọi phương thức này có nghĩa ExcutorService sẽ từ chối nhận thêm các nhiệm vụ (Task), và một khi tất cả các nhiệm vụ đã được thêm vào trước đó đã hòan thành. Sau đó Executor sẽ được tắt (Có nghĩa tất cả các task được thêm vào trước khi gọi shutdown() đều sẽ được thực thi).

executorService.shutdown();

ShutdownNow() Nếu bạn muốn tắt ExecutorService ngay lập tức, bạn có thể gọi phương thức shutdownNow(). Điều này sẽ cố gắng ngắn chặn tất cả các nhiệm vụ ngay lập tức và loại bỏ các nhiệm vụ đã được đưa vào Queue nhưng chưa được thực thi. Không có gì đảm bảo về việc tắt các nhiệm vụ đang chạy hòan tòan, nhưng phương thức này là nỗ lực tốt nhất để tắt chúng.

executorService.shutdownNow();

awaitTermination() Phương thức ExecutorService awaitTermination () sẽ chặn luồng gọi nó cho đến khi ExecutorService tắt hoàn toàn hoặc cho đến khi hết thời gian nhất định. Phương thức awaitTermination () thường được gọi sau khi gọi shutdown () hoặc shutdownNow ().

executorService.shutdown(); executorService.awaitTermination();

Lưu ý: Bạn nên shutdown một ThreadPool bằng cách gọi phương thức shutdown() bởi vì ta không thể chắc chắn được rằng máy ảo Java có thể tự động làm điều đó

All Rights Reserved

Tìm Hiểu Về File I/O Trong Java

Để làm theo hướng dẫn trong bài học này trên máy của bạn cần được cài đặt Java Development Kit (hay JDK). JDK giúp chúng ta có thể compile mã lệnh và chạy chương trình.

Import Class

Bây giờ bạn tạo một tập tin với tên FileIOExample.java với nội dung như sau:

import java.io.File; import java.io.IOException; class FileIOExample { public static void main( String[] args ) { System.out.println("Hello Java!"); } }

Ở trên chúng ta import vào hai class là java.io.File và java.io.IOException. Chúng ta sẽ sử dụng hai Class này ở phần tiếp theo. Bây giờ compile file trên và chạy thử. Nếu trên Linux thì bạn có thể sử dụng câu lệnh sau để compile chương trình:

$ javac FileIOExample.java

Và sau đó chạy:

$ java FileIOExample

Tạo File Trong Java

Để tạo file trong Java chúng ta sử dụng phương thức createNewFile() của File class. Trước tiên tạo một object từ class này:

import java.io.File; import java.io.IOException; class FileIOExample { public static void main( String[] args ) { try { File myFile = new File("./my_sample_file.tmp"); boolean result = myFile.createNewFile(); if (result) { System.out.println("Success!"); } else { System.out.println("File exists!"); } } catch (IOException e) { System.out.println("Error!"); } } }

Ở trên chúng ta khởi tạo biến myFile là một object instance tạo ra bởi class File trong Java:

File myFile = new File("my_sample_file.txt");

Tiếp theo chúng ta gọi phương thức createNewFile() của object vừa được tạo ở trên để tạo ra một tập tin với tên là my_sample_file.txt, kết quả trả về là một giá trị boolean:

boolean result = myFile.createNewFile();

Các bạn lưu ý rằng phương thức createNewFile() có thể tạo trả về lỗi IOException trong trường hợp java không gặp lỗi khi tạo file. Do vậy Java quy định chúng ta cần phải handle việc xử lý lỗi ngay khi phương thức này được gọi. Trong ví dụ trên chúng ta đã sử dụng try...catch để handle trường hợp gặp phải lỗi.

Biến result sẽ nhận một trong hai giá trị là true trong trường hợp file được tạo thành công hoặc false nếu như file đã tồn tại trên hệ thống.

Bây giờ compile lại chương trình và chạy thử bạn, nếu như file my_sample_file.tmp không tồn tại và Java có quyền tạo file này thì bạn sẽ thấy dòng thông báo Success! hiển thị và đồng thời Java cũng tạo ra file này trên hệ thống với nội dung trống rỗng.