Cách triển khai giao diện có thể gọi trong Java



Bài viết này sẽ cung cấp cho bạn kiến ​​thức chi tiết và toàn diện về cách triển khai Giao diện có thể gọi trong Java với các ví dụ.

Các chương trình đa luồng Java chứng kiến ​​việc sử dụng rộng rãi Có thể gọi và Tương lai. Dưới những kiến ​​thức tiên quyết về lô đề và đa luồng, bạn đọc sẽ dễ nắm bắt hơn khi thảo luận trong bài viết này. Như tôi sẽ giải thích về Giao diện có thể gọi trong Java trong bài viết này.

Tóm tắt lại chủ đề

Tuy nhiên, tôi xin giới thiệu sơ qua về khái niệm luồng. Luồng là một đường dẫn thực thi riêng, trong trường hợp bạn cần thực hiện một công việc lặp đi lặp lại, công việc có thể được chia thành nhiều nhiệm vụ và gán chúng cho các tiểu trình. Đa luồngkhông có gì khác ngoài việc gán nhiều luồng để thực hiện các nhiệm vụ khác nhau song song để có được kết quả nhanh chóng.





Giao diện có thể gọi trong Java là gì

Đối với Java 5, lớp “java.util.concurrent” đã được giới thiệu. Giao diện có thể gọi này được đưa vào thông qua gói đồng thời trông tương tự như giao diện Runnable. Nó cũng có thể trả về bất kỳ đối tượng nào và có thể ném một Ngoại lệ. Một giao diện Java Callable sử dụng Generics, do đó có thể trả về bất kỳ loại đối tượng nào. Executor Framework cung cấp một phương thức submit () để thực thi các triển khai Callable trong một nhóm các luồng. Trên thực tế, Java Executor Framework tuân theo các mẫu WorkerThread.

java-interfaceTrong một nhóm luồng, người dùng có thể bắt đầu các luồng bằng cách sử dụng phương thức Executor.newFixedThreadPool (10) và gửi một nhiệm vụ cho nó. Một runnable hoạt động như đích của một luồng và phương thức public void run () được triển khai bắt buộc để xác định tác vụ. Điều này sẽ được thực thi bởi các luồng trong nhóm luồng. Dựa trên sự sẵn có của các luồng trong nhóm, Khung công tác thực thi chỉ định công việc (mục tiêu có thể chạy) cho các luồng.Nếu tất cả các luồng đang được sử dụng, tác vụ phải bị dừng lại. Sau khi luồng hoàn thành một nhiệm vụ thì nó sẽ trở lại nhóm như một luồng có sẵn, sẵn sàng chấp nhận các tác vụ trong tương lai. Callable tương tự như Runnable và có thể trả về bất kỳ loại đối tượng nào khi chúng ta muốn lấy một kết quả hoặc trạng thái từ tác vụ.



Trả lại giao diện có thể gọi

Java Callable trả về java.util.concurrent. Java Future cung cấp phương thức hủy () để loại bỏ tác vụ có thể gọi được liên quan. Đây là một phiên bản quá tải của phương thức get (), nơi người ta có thể chỉ định một khoảng thời gian nhất định để đợi kết quả. Sẽ rất hữu ích nếu bạn tránh một chuỗi hiện tại có thể bị chặn trong thời gian dài hơn. Hãy nhớ rằng phương thức get là một phương thức đồng bộ và cho đến khi có thể gọi hoàn thành nhiệm vụ của nó và trả về một giá trị, nó sẽ phải đợi một phương thức có thể gọi.

Ngoài ra còn có các phương thức “isDone ()” và “isCancell ()” để tìm nạp trạng thái hiện tại của một tác vụ có thể gọi được liên kết. Hãy xem xét ví dụ trong đó tổng của tất cả các số từ một đến 100 cần được tìm thấy. Chúng ta có thể lặp từ 1 đến 100 tuần tự và thêm chúng vào cuối cùng. Một khả năng khác là bằng cách phân chia và chinh phục. Trong phương pháp này, chúng ta có thể nhóm các số theo cách sao cho mỗi nhóm có đúng hai phần tử. Cuối cùng, chúng ta có thể gán nhóm đó vào một nhóm các chủ đề. Do đó, mỗi luồng trả về một tổng một phần song song và sau đó thu thập các tổng một phần đó và cộng chúng để có được tổng toàn bộ.



Đặc điểm của Lớp có thể gọi và Lớp tương lai

  • Lớp có thể gọi là một giao diện kiểu SAM và do đó nó có thể được triển khai trong biểu thức lambda.

    trim làm gì trong java
  • Lớp có thể gọi chỉ có một phương thức “call ()” chứa tất cả các mã cần thiết để thực thi không đồng bộ.

  • Trong môi trường giao diện có thể chạy, không có khả năng trả về kết quả của phép tính hoặc ném ngoại lệ đã kiểm tra. Trong khi với Callable trả về một giá trị và ném một ngoại lệ đã kiểm tra thì khả dụng.

  • Phương thức Get () của lớp Future có thể được sử dụng để lấy kết quả sau khi tính toán xong. Người dùng cũng có thể kiểm tra xem tính toán đã hoàn tất hay chưa bằng cách sử dụng phương thức done ().

  • Hủy tính toán bằng cách sử dụng phương thức future.cancel () cũng là một lợi ích trong một số ứng dụng.

  • Get () được gọi là lệnh gọi chặn và nó tiếp tục chặn cho đến khi hoàn tất tính toán.

So sánh các lớp có thể gọi và chạy được

Gọi được Runnable
Nó là một phần của “ java.util.concurrent ' gói kể từ Java 1.5Nó là một phần của gói java.lang kể từ Java 1.0
Giao diện được tham số hóa, chẳng hạn như CallableGiao diện không tham số hóa
Có khả năng ném một Ngoại lệ đã kiểm traNó không thể ném một ngoại lệ đã kiểm tra
Nó chứa một phương thức duy nhất, call (), trả về Kiểu V, điều này giống với tham số giao diện đã xác định “Kiểu”Ở đây, nó chứa một phương thức duy nhất, được gọi là run (), trả về void

Dưới đây là một ví dụ đơn giản về một lớp có thể gọi Java được triển khai trong đó mã trả về tên của luồng cụ thể, đang thực thi tác vụ sau một giây. Ở đây, chúng tôi sử dụng khung giải nén để thực thi 100 tác vụ song song với Java Future cho kết quả của các tác vụ đã gửi. Đoạn mã đầu tiên là đầu ra và đoạn mã bên dưới đại diện cho mã.

package com.journaldev.threads import java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java .util.concurrent.Executor import java.util.concurrent.Future public class MyCallable thực hiện Callable {@Override public String call () throws Exception {Thread.sleep (1000) // trả về tên chuỗi thực thi tác vụ có thể gọi này trả về Thread.currentThread () .getName ()} public static void main (String args []) {// Lấy ExecutorService từ lớp tiện ích Executor, kích thước nhóm luồng là 10 ExecutorService executive = Executor.newFixedThreadPool (10) // tạo danh sách để lưu giữ Tương lai đối tượng được liên kết với Danh sách có thể gọilist = new ArrayList() // Tạo phiên bản MyCallable Callable callable = new MyCallable () for (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

Tắt dịch vụ của người thừa hành

Khía cạnh cốt yếu và quan trọng mà nhiều nhà phát triển bỏ lỡ là tắt ExecutorService. ExecutorService rất quan trọng và được tạo với các phần tử luồng bổ sung. Hãy nhớ rằng JVM chỉ dừng khi tất cả các luồng không phải daemon bị dừng. Do đó, chỉ cần tắt dịch vụ trình thực thi sẽ ngăn JVM dừng lại.

Để thông báo cho dịch vụ thực thi rằng không cần các luồng chạy, chúng ta nên tắt dịch vụ.

Có ba cách để gọi tắt máy:

  • void shutdown () - Điều này Bắt đầu một quá trình tắt có trật tự trong đó các nhiệm vụ đã gửi trước đó được thực thi, nhưng không có nhiệm vụ mới nào được chấp nhận.
  • Danh sách shutdownNow () - Nó cố gắng dừng tất cả các tác vụ đang thực thi, tạm dừng xử lý các tác vụ đang chờ xử lý và cũng trả về danh sách các tác vụ đang chờ thực hiện.
  • void awaitTermination () - Thao tác này tiếp tục chặn cho đến khi tất cả các tác vụ hoàn tất thực thi sau khi có yêu cầu tắt máy hoặc hết thời gian chờ xảy ra. Nó cũng chặn khi luồng hiện tại bị ngắt. Tất cả phụ thuộc vào nhiệm vụ nào đến trước.

Với điều này, chúng ta đến cuối bài viết Giao diện có thể gọi trong Java. Tôi hy vọng bạn đã hiểu về Giao diện Tương lai và Có thể gọi trong Java.

Kiểm tra của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java.

ghi đè so với ghi đè c ++

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của blog “Giao diện có thể gọi trong Java” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.