Interpreter

Phiên dịch cuối kỳ công khai

Lớp trình điều khiển để điều khiển suy luận mô hình với TensorFlow Lite.

Lưu ý: Nếu bạn không cần quyền truy cập vào bất kỳ tính năng API "thử nghiệm" nào bên dưới, hãy ưu tiên sử dụng InterpreterApi và InterpreterFactory hơn là sử dụng trực tiếp Interpreter.

Interpreter đóng gói mô hình TensorFlow Lite được đào tạo trước, trong đó các hoạt động được thực thi để suy luận mô hình.

Ví dụ: nếu một mô hình chỉ nhận một đầu vào và chỉ trả về một đầu ra:

try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.run(input, output);
 }
 

Nếu một mô hình có nhiều đầu vào hoặc đầu ra:

Object[] inputs = {input0, input1, ...};
 Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
 FloatBuffer ith_output = FloatBuffer.allocateDirect(3 * 2 * 4);  // Float tensor, shape 3x2x4.
 ith_output.order(ByteOrder.nativeOrder());
 map_of_indices_to_outputs.put(i, ith_output);
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
 }
 

Nếu một mô hình lấy hoặc tạo ra các tensor chuỗi:

String[] input = {"foo", "bar"};  // Input tensor shape is [2].
 String[][] output = new String[3][2];  // Output tensor shape is [3, 2].
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, output);
 }
 

Lưu ý rằng có sự khác biệt giữa hình dạng [] và hình dạng [1]. Đối với đầu ra tensor chuỗi vô hướng:

String[] input = {"foo"};  // Input tensor shape is [1].
 ByteBuffer outputBuffer = ByteBuffer.allocate(OUTPUT_BYTES_SIZE);  // Output tensor shape is [].
 try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
   interpreter.runForMultipleInputsOutputs(input, outputBuffer);
 }
 byte[] outputBytes = new byte[outputBuffer.remaining()];
 outputBuffer.get(outputBytes);
 // Below, the `charset` can be StandardCharsets.UTF_8.
 String output = new String(outputBytes, charset);
 

Thứ tự của đầu vào và đầu ra được xác định khi chuyển đổi mô hình TensorFlow sang mô hình TensorFlowLite bằng Toco, cũng như hình dạng mặc định của đầu vào.

Khi đầu vào được cung cấp dưới dạng mảng (đa chiều), (các) tensor đầu vào tương ứng sẽ được thay đổi kích thước hoàn toàn theo hình dạng của mảng đó. Khi đầu vào được cung cấp dưới dạng loại Buffer , việc thay đổi kích thước ngầm định sẽ không được thực hiện; người gọi phải đảm bảo rằng kích thước byte Buffer khớp với kích thước của tenxơ tương ứng hoặc trước tiên họ thay đổi kích thước của tenxơ thông qua resizeInput(int, int[]) . Thông tin về hình dạng và loại tenxơ có thể được lấy thông qua lớp Tensor , có sẵn thông qua getInputTensor(int)getOutputTensor(int) .

CẢNH BÁO: Các phiên bản Interpreter không an toàn theo luồng. Interpreter sở hữu các tài nguyên phải được giải phóng rõ ràng bằng cách gọi close()

Thư viện TFLite được xây dựng dựa trên NDK API 19. Nó có thể hoạt động với các cấp API Android dưới 19 nhưng không được đảm bảo.

Các lớp lồng nhau

lớp học Thông dịch viên.Options Một lớp tùy chọn để kiểm soát hành vi của trình thông dịch thời gian chạy.

Nhà xây dựng công cộng

Trình thông dịch ( File modelFile)
Khởi tạo một Interpreter .
Trình thông dịch (Tùy chọn tệp modelFile, Interpreter.Options )
Khởi tạo Interpreter và chỉ định các tùy chọn để tùy chỉnh hành vi của trình thông dịch.
Trình thông dịch ( ByteBuffer byteBuffer)
Khởi tạo Interpreter bằng ByteBuffer của tệp mô hình.
Trình thông dịch (tùy chọn ByteBuffer byteBuffer, Interpreter.Options )
Khởi tạo Interpreter bằng ByteBuffer của tệp mô hình và một tập hợp Interpreter.Options tùy chỉnh.

Phương pháp công khai

trống rỗng
phân bổTensors ()
Cập nhật rõ ràng việc phân bổ cho tất cả các tensor, nếu cần.
trống rỗng
đóng ()
Giải phóng các tài nguyên được liên kết với phiên bản InterpreterApi .
int
getInputIndex ( Chuỗi opName)
Lấy chỉ mục của một đầu vào dựa trên tên op của đầu vào.
Tenxơ
getInputTensor (int inputIndex)
Lấy Tensor liên kết với chỉ mục đầu vào được cung cấp.
int
getInputTensorCount ()
Lấy số lượng tensor đầu vào.
Tenxơ
getInputTensorFromSignature ( String inputName, String signatureKey)
Nhận Tensor được liên kết với tên đầu vào và tên phương thức chữ ký được cung cấp.
Dài
getLastNativeInferenceDurationNanoseconds ()
Trả về thời gian suy luận gốc.
int
getOutputIndex ( Chuỗi opName)
Lấy chỉ mục của một đầu ra dựa trên tên op của đầu ra.
Tenxơ
getOutputTensor (int đầu ra Index)
Lấy Tensor liên kết với chỉ số đầu ra được cung cấp.
int
getOutputTensorCount ()
Lấy số lượng Tensor đầu ra.
Tenxơ
getOutputTensorFromSignature ( Tên đầu ra chuỗi, Chữ ký chuỗi)
Lấy Tensor liên kết với tên đầu ra được cung cấp trong phương thức chữ ký cụ thể.
Sợi dây[]
getSignatureInputs ( Chuỗi signatureKey)
Lấy danh sách đầu vào SignatureDefs cho phương thức signatureKey .
Sợi dây[]
getSignatureKeys ()
Lấy danh sách tên phương thức được xuất SignatureDef có sẵn trong mô hình.
Sợi dây[]
getSignatureOutputs ( Chuỗi signatureKey)
Lấy danh sách đầu ra của SignatureDefs cho phương thức signatureKey .
trống rỗng
resetVariableTensors ()
Nâng cao: Đặt lại tất cả các tensor biến đổi về giá trị mặc định.
trống rỗng
thay đổi kích thướcInput (int idx, int[] dims, boolean nghiêm ngặt)
Thay đổi kích thước đầu vào idx-th của mô hình gốc thành độ mờ nhất định.
trống rỗng
thay đổi kích thướcInput (int idx, int[] dims)
Thay đổi kích thước đầu vào idx-th của mô hình gốc thành độ mờ nhất định.
trống rỗng
run (Đầu vào đối tượng , Đầu ra đối tượng )
Chạy suy luận mô hình nếu mô hình chỉ nhận một đầu vào và chỉ cung cấp một đầu ra.
trống rỗng
runForMultipleInputsOutputs ( đầu vào Object[] , đầu ra Map < Integer , Object >)
Chạy suy luận mô hình nếu mô hình nhận nhiều đầu vào hoặc trả về nhiều đầu ra.
trống rỗng
runSignature ( Map < String , Object > đầu vào, Map < String , Object > đầu ra)
Tương tự như runSignature(Map, Map, String) nhưng không yêu cầu chuyển signatureKey, giả sử mô hình có một SignatureDef.
trống rỗng
runSignature ( Map < String , Object > đầu vào, Map < String , Object > đầu ra, String signatureKey)
Chạy suy luận mô hình dựa trên SignatureDef được cung cấp thông qua signatureKey .
trống rỗng
setCancelled (đã hủy boolean)
Nâng cao: Ngắt suy luận khi đang gọi run(Object, Object) .

Phương pháp kế thừa

Nhà xây dựng công cộng

Thông dịch viên công cộng ( File modelFile)

Khởi tạo một Interpreter .

Thông số
tập tin mô hình Tệp của mô hình TF Lite được đào tạo trước.
Ném
Ngoại lệ Đối số bất hợp pháp nếu modelFile không mã hóa mô hình TensorFlow Lite hợp lệ.

Public Interpreter (Tùy chọn File modelFile, Interpreter.Options )

Khởi tạo Interpreter và chỉ định các tùy chọn để tùy chỉnh hành vi của trình thông dịch.

Thông số
tập tin mô hình một tập tin của mô hình TF Lite được đào tạo trước
tùy chọn một tập hợp các tùy chọn để tùy chỉnh hành vi của trình thông dịch
Ném
Ngoại lệ Đối số bất hợp pháp nếu modelFile không mã hóa mô hình TensorFlow Lite hợp lệ.

Trình thông dịch công cộng ( ByteBuffer byteBuffer)

Khởi tạo Interpreter bằng ByteBuffer của tệp mô hình.

Không nên sửa đổi ByteBuffer sau khi xây dựng Interpreter . ByteBuffer có thể là MappedByteBuffer ánh xạ bộ nhớ tệp mô hình hoặc ByteBuffer trực tiếp của localOrder() chứa nội dung byte của mô hình.

Thông số
byteBuffer
Ném
Ngoại lệ Đối số bất hợp pháp nếu byteBuffer không phải là MappedByteBuffer cũng không phải là ByteBuffer trực tiếp của NativeOrder.

Trình thông dịch công cộng (tùy chọn ByteBuffer byteBuffer, Interpreter.Options )

Khởi tạo Interpreter bằng ByteBuffer của tệp mô hình và một tập hợp Interpreter.Options tùy chỉnh.

Không nên sửa đổi ByteBuffer sau khi xây dựng Interpreter . ByteBuffer có thể là MappedByteBuffer ánh xạ bộ nhớ tệp mô hình hoặc ByteBuffer trực tiếp của localOrder() chứa nội dung byte của mô hình.

Thông số
byteBuffer
tùy chọn
Ném
Ngoại lệ Đối số bất hợp pháp nếu byteBuffer không phải là MappedByteBuffer cũng không phải là ByteBuffer trực tiếp của NativeOrder.

Phương pháp công khai

public void phân bổ Tensors ()

Cập nhật rõ ràng việc phân bổ cho tất cả các tensor, nếu cần.

Điều này sẽ truyền các hình dạng và phân bổ bộ nhớ cho các tensor phụ thuộc bằng cách sử dụng (các) hình dạng tensor đầu vào như đã cho.

Lưu ý: Lệnh gọi này *hoàn toàn là tùy chọn*. Việc phân bổ tensor sẽ tự động diễn ra trong quá trình thực thi nếu bất kỳ tensor đầu vào nào đã được thay đổi kích thước. Lệnh gọi này hữu ích nhất trong việc xác định hình dạng cho bất kỳ tensor đầu ra nào trước khi thực hiện biểu đồ, ví dụ:

 interpreter.resizeInput(0, new int[]{1, 4, 4, 3}));
 interpreter.allocateTensors();
 FloatBuffer input = FloatBuffer.allocate(interpreter.getInputTensor(0).numElements());
 // Populate inputs...
 FloatBuffer output = FloatBuffer.allocate(interpreter.getOutputTensor(0).numElements());
 interpreter.run(input, output)
 // Process outputs...

Lưu ý: Một số biểu đồ có đầu ra được định hình động, trong trường hợp đó, hình dạng đầu ra có thể không lan truyền hoàn toàn cho đến khi thực hiện suy luận.

đóng khoảng trống công khai ()

Giải phóng các tài nguyên được liên kết với phiên bản InterpreterApi .

int công khai getInputIndex ( Chuỗi opName)

Lấy chỉ mục của một đầu vào dựa trên tên op của đầu vào.

Thông số
tên op

Tensor công khai getInputTensor (int inputIndex)

Lấy Tensor liên kết với chỉ mục đầu vào được cung cấp.

Thông số
chỉ số đầu vào

int công khai getInputTensorCount ()

Lấy số lượng tensor đầu vào.

Tensor công khai getInputTensorFromSignature ( String inputName, String signatureKey)

Nhận Tensor được liên kết với tên đầu vào và tên phương thức chữ ký được cung cấp.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
tên đầu vào Nhập tên vào chữ ký.
chữ kýKey Khóa chữ ký xác định SignatureDef, có thể rỗng nếu mô hình có một chữ ký.
Ném
Ngoại lệ Đối số bất hợp pháp nếu inputName hoặc signatureKey rỗng hoặc trống hoặc tên được cung cấp không hợp lệ.

công khai Long getLastNativeInferenceDurationNanoseconds ()

Trả về thời gian suy luận gốc.

int công khai getOutputIndex ( Chuỗi opName)

Lấy chỉ mục của một đầu ra dựa trên tên op của đầu ra.

Thông số
tên op

Tensor công khai getOutputTensor (int inputIndex)

Lấy Tensor liên kết với chỉ số đầu ra được cung cấp.

Lưu ý: Các chi tiết tensor đầu ra (ví dụ: hình dạng) có thể không được điền đầy đủ cho đến khi thực hiện suy luận. Nếu bạn cần cập nhật thông tin chi tiết *trước khi* chạy suy luận (ví dụ: sau khi thay đổi kích thước một tenxơ đầu vào, điều này có thể làm mất hiệu lực hình dạng tenxơ đầu ra), hãy sử dụng allocateTensors() để kích hoạt phân bổ và truyền bá hình dạng một cách rõ ràng. Lưu ý rằng, đối với các biểu đồ có hình dạng đầu ra phụ thuộc vào *giá trị* đầu vào, hình dạng đầu ra có thể không được xác định đầy đủ cho đến khi chạy suy luận.

Thông số
chỉ số đầu ra

int công khai getOutputTensorCount ()

Lấy số lượng Tensor đầu ra.

Tensor công khai getOutputTensorFromSignature ( Tên đầu ra chuỗi , Chữ ký chuỗi )

Lấy Tensor liên kết với tên đầu ra được cung cấp trong phương thức chữ ký cụ thể.

Lưu ý: Các chi tiết tensor đầu ra (ví dụ: hình dạng) có thể không được điền đầy đủ cho đến khi thực hiện suy luận. Nếu bạn cần cập nhật thông tin chi tiết *trước khi* chạy suy luận (ví dụ: sau khi thay đổi kích thước một tenxơ đầu vào, điều này có thể làm mất hiệu lực hình dạng tenxơ đầu ra), hãy sử dụng allocateTensors() để kích hoạt phân bổ và truyền bá hình dạng một cách rõ ràng. Lưu ý rằng, đối với các biểu đồ có hình dạng đầu ra phụ thuộc vào *giá trị* đầu vào, hình dạng đầu ra có thể không được xác định đầy đủ cho đến khi chạy suy luận.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
tên đầu ra Tên đầu ra trong chữ ký.
chữ kýKey Khóa chữ ký xác định SignatureDef, có thể rỗng nếu mô hình có một chữ ký.
Ném
Ngoại lệ Đối số bất hợp pháp nếu outputName hoặc signatureKey rỗng hoặc trống hoặc tên được cung cấp không hợp lệ.

Chuỗi công khai[] getSignatureInputs ( Chuỗi signatureKey)

Lấy danh sách đầu vào SignatureDefs cho phương thức signatureKey .

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
chữ kýKey

Chuỗi công khai[] getSignatureKeys ()

Lấy danh sách tên phương thức được xuất SignatureDef có sẵn trong mô hình.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Chuỗi công khai[] getSignatureOutputs ( Chuỗi signatureKey)

Lấy danh sách đầu ra của SignatureDefs cho phương thức signatureKey .

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
chữ kýKey

public void resetVariableTensors ()

Nâng cao: Đặt lại tất cả các tensor biến đổi về giá trị mặc định.

Nếu một tensor biến thiên không có bộ đệm liên quan, nó sẽ được đặt lại về 0.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

public void thay đổi kích thướcInput (int idx, int[] dims, boolean strict)

Thay đổi kích thước đầu vào idx-th của mô hình gốc thành độ mờ nhất định.

Khi `nghiêm ngặt` là Đúng, chỉ có thể thay đổi kích thước các kích thước không xác định. Các kích thước không xác định được biểu thị là `-1` trong mảng được trả về bởi `Tensor.shapeSignature()`.

Thông số
idx
mờ đi
nghiêm ngặt

public void thay đổi kích thướcInput (int idx, int[] dims)

Thay đổi kích thước đầu vào idx-th của mô hình gốc thành độ mờ nhất định.

Thông số
idx
mờ đi

public void run (Đầu vào đối tượng , Đầu ra đối tượng )

Chạy suy luận mô hình nếu mô hình chỉ nhận một đầu vào và chỉ cung cấp một đầu ra.

Cảnh báo: API sẽ hiệu quả hơn nếu sử dụng Buffer (tốt nhất là trực tiếp nhưng không bắt buộc) làm loại dữ liệu đầu vào/đầu ra. Vui lòng cân nhắc sử dụng Buffer để cung cấp và tìm nạp dữ liệu gốc để có hiệu suất tốt hơn. Các loại Buffer đệm cụ thể sau đây được hỗ trợ:

  • ByteBuffer - tương thích với mọi loại Tensor nguyên thủy cơ bản.
  • FloatBuffer - tương thích với Tensor float.
  • IntBuffer - tương thích với Tensor int32.
  • LongBuffer - tương thích với Tensor int64.
Lưu ý rằng các kiểu boolean chỉ được hỗ trợ dưới dạng mảng chứ không phải Buffer hoặc dưới dạng đầu vào vô hướng.

Thông số
đầu vào một mảng hoặc mảng nhiều chiều hoặc Buffer gồm các kiểu nguyên thủy bao gồm int, float, long và byte. Buffer là cách ưa thích để truyền dữ liệu đầu vào lớn cho các kiểu nguyên thủy, trong khi các kiểu chuỗi yêu cầu sử dụng đường dẫn đầu vào mảng (đa chiều). Khi Buffer được sử dụng, nội dung của nó sẽ không thay đổi cho đến khi thực hiện suy luận mô hình và người gọi phải đảm bảo rằng Buffer ở vị trí đọc thích hợp. Giá trị null chỉ được phép nếu người gọi đang sử dụng Delegate cho phép tương tác xử lý bộ đệm và bộ đệm như vậy đã được liên kết với Tensor đầu vào.
đầu ra một mảng dữ liệu đầu ra đa chiều hoặc Buffer gồm các kiểu nguyên thủy bao gồm int, float, long và byte. Khi sử dụng Buffer , người gọi phải đảm bảo rằng nó được đặt ở vị trí ghi thích hợp. Giá trị null được cho phép và hữu ích trong một số trường hợp nhất định, ví dụ: nếu người gọi đang sử dụng Delegate cho phép tương tác xử lý bộ đệm và bộ đệm như vậy đã được liên kết với Tensor đầu ra (xem thêm Interpreter.Options#setAllowBufferHandleOutput(boolean) ) hoặc nếu biểu đồ có đầu ra được định hình động và trình gọi phải truy vấn hình dạng Tensor đầu ra sau khi suy luận được gọi, tìm nạp dữ liệu trực tiếp từ tensor đầu ra (thông qua Tensor.asReadOnlyBuffer() ).

public void runForMultipleInputsOutputs ( đầu vào Object[] , đầu ra Map < Integer , Object >)

Chạy suy luận mô hình nếu mô hình nhận nhiều đầu vào hoặc trả về nhiều đầu ra.

Cảnh báo: API sẽ hiệu quả hơn nếu sử dụng Buffer s (tốt nhất là trực tiếp, nhưng không bắt buộc) làm loại dữ liệu đầu vào/đầu ra. Vui lòng cân nhắc sử dụng Buffer để cung cấp và tìm nạp dữ liệu gốc để có hiệu suất tốt hơn. Các loại Buffer đệm cụ thể sau đây được hỗ trợ:

  • ByteBuffer - tương thích với mọi loại Tensor nguyên thủy cơ bản.
  • FloatBuffer - tương thích với Tensor float.
  • IntBuffer - tương thích với Tensor int32.
  • LongBuffer - tương thích với Tensor int64.
Lưu ý rằng các kiểu boolean chỉ được hỗ trợ dưới dạng mảng chứ không phải Buffer hoặc dưới dạng đầu vào vô hướng.

Lưu ý: chỉ cho phép các giá trị null cho các phần tử riêng lẻ của inputsoutputs nếu người gọi đang sử dụng Delegate cho phép tương tác xử lý bộ đệm và bộ đệm như vậy đã được liên kết với (các) Tensor đầu vào hoặc đầu ra tương ứng.

Thông số
đầu vào một mảng dữ liệu đầu vào. Các đầu vào phải theo cùng thứ tự với các đầu vào của mô hình. Mỗi đầu vào có thể là một mảng hoặc mảng nhiều chiều hoặc Buffer có các kiểu nguyên thủy bao gồm int, float, long và byte. Buffer là cách ưa thích để truyền dữ liệu đầu vào lớn, trong khi loại chuỗi yêu cầu sử dụng đường dẫn đầu vào mảng (đa chiều). Khi Buffer được sử dụng, nội dung của nó sẽ không thay đổi cho đến khi thực hiện suy luận mô hình và người gọi phải đảm bảo rằng Buffer ở vị trí đọc thích hợp.
kết quả đầu ra một bản đồ ánh xạ các chỉ mục đầu ra tới các mảng đa chiều của dữ liệu đầu ra hoặc Buffer thuộc các kiểu nguyên thủy bao gồm int, float, long và byte. Nó chỉ cần giữ các mục để đầu ra được sử dụng. Khi sử dụng Buffer , người gọi phải đảm bảo rằng nó được đặt ở vị trí ghi thích hợp. Bản đồ có thể trống trong các trường hợp sử dụng bộ điều khiển bộ đệm cho dữ liệu tensor đầu ra hoặc trường hợp đầu ra được định hình động và người gọi phải truy vấn hình dạng Tensor đầu ra sau khi suy luận được gọi, tìm nạp dữ liệu trực tiếp từ tensor đầu ra ( thông qua Tensor.asReadOnlyBuffer() ).

public void runSignature ( Map < String , Object > đầu vào, Map < String , Object > đầu ra)

Tương tự như runSignature(Map, Map, String) nhưng không yêu cầu chuyển signatureKey, giả sử mô hình có một SignatureDef. Nếu mô hình có nhiều hơn một SignatureDef, nó sẽ đưa ra một ngoại lệ.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
đầu vào
kết quả đầu ra

public void runSignature ( Map < String , Object > đầu vào, Map < String , Object > đầu ra, String signatureKey)

Chạy suy luận mô hình dựa trên SignatureDef được cung cấp thông qua signatureKey .

Xem run(Object, Object) để biết thêm chi tiết về các loại dữ liệu đầu vào và đầu ra được phép.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
đầu vào Ánh xạ từ tên đầu vào trong SignatureDef tới đối tượng đầu vào.
kết quả đầu ra Ánh xạ từ tên đầu ra trong SignatureDef đến dữ liệu đầu ra. Điều này có thể trống nếu người gọi muốn truy vấn trực tiếp dữ liệu Tensor sau khi suy luận (ví dụ: nếu hình dạng đầu ra là động hoặc sử dụng các bộ điều khiển bộ đệm đầu ra).
chữ kýKey Khóa chữ ký xác định SignatureDef.
Ném
Ngoại lệ Đối số bất hợp pháp nếu inputs là rỗng hoặc trống, nếu outputs hoặc signatureKey là rỗng hoặc nếu xảy ra lỗi khi chạy suy luận.

public void set Đã hủy (đã hủy boolean)

Nâng cao: Ngắt suy luận khi đang gọi run(Object, Object) .

Cờ hủy sẽ được đặt thành true khi hàm này được gọi. Trình thông dịch sẽ kiểm tra cờ giữa các lệnh Op và nếu nó true , trình thông dịch sẽ dừng thực thi. Trình thông dịch sẽ vẫn ở trạng thái bị hủy cho đến khi được setCancelled(false) "hủy hủy" một cách rõ ràng.

CẢNH BÁO: Đây là API thử nghiệm và có thể thay đổi.

Thông số
đã hủy bỏ true để hủy bỏ suy luận theo cách hiệu quả nhất; false để tiếp tục.
Ném
Ngoại lệ nhà nước bất hợp pháp nếu trình thông dịch không được khởi tạo với tùy chọn có thể hủy, tùy chọn này bị tắt theo mặc định.