cuốn sách gpt4 ai đã làm

8 cách tạo thread, 90% mọi người đều không biết

In lại Tác giả: Sahara Thời gian cập nhật: 2024-12-30 12:46:47 57 4
mua khóa gpt4 Nike

Lời nói đầu

Trong phát triển Java, luồng là công cụ cốt lõi trong lập trình đồng thời.

Cho dù đó là để cải thiện hiệu quả chạy chương trình hay để xử lý các tác vụ đồng thời phức tạp, chúng ta đều cần sử dụng các luồng trong mã của mình.

Nhưng nếu bạn chỉ biết Thread và Runnable thì bạn sẽ tụt lại phía sau một chút.

Trên thực tế, Java cung cấp nhiều cách để tạo luồng, mỗi cách đều có những ưu điểm riêng và các tình huống có thể áp dụng.

Bài viết này sẽ phân tích chi tiết 8 phương pháp tạo thread trong Java từ nông đến sâu. Mỗi phương pháp sẽ đi kèm với mã mẫu và phân tích kịch bản để giúp bạn nắm vững cách tạo và quản lý thread, hy vọng nó sẽ hữu ích. cho bạn.

(Gần đây tôi đã mở một dự án trung tâm mua sắm dựa trên SpringBoot+Vue+uniapp. Chào mừng bạn đến thăm và đóng vai chính.) [https://gitee.com/dvsusan/susan_mall].

1. Kế thừa lớp Thread

Kế thừa trực tiếp lớp Thread, ghi đè phương thức run() và viết logic tác vụ trong run().

Bắt đầu thread bằng cách gọi phương thức start().

Mã mẫu

class MyThread mở rộng Chủ đề { @Override public void run() { System.out.println("Tên chủ đề: " + Thread.currentThread().getName() + " Nhiệm vụ thực thi" } } public class ThreadExample { public static void main(String[] args) { MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); Bắt đầu chủ đề thread2.start();

Phân tích cảnh

Kế thừa Thread là cách đơn giản nhất và rất phù hợp cho người mới bắt đầu tìm hiểu nguyên lý cơ bản của thread. Tuy nhiên, phương thức này có khả năng mở rộng kém, vì Java là ngôn ngữ kế thừa đơn, và sau khi kế thừa Thread, nó không thể kế thừa các lớp khác.

Ưu điểm của point point

  • lợi thế: Đơn giản và trực quan, phù hợp cho các nhiệm vụ nhỏ.
  • thiếu sót: Kế thừa lớp bị hạn chế và logic hiện có không thể được sử dụng lại.

2. Triển khai giao diện Runnable

Triển khai giao diện Runnable và viết logic tác vụ trong phương thức run().

Truyền đối tượng Runnable thông qua hàm tạo Thread để bắt đầu luồng.

Mã mẫu

class MyRunnable triển khai Runnable { @Override public void run() { System.out.println("Tên chủ đề: " + Thread.currentThread().getName() + " Tác vụ thực thi" } } public class RunnableExample { public static void main(String[] args) { Chủ đề thread1 = Chủ đề mới (MyRunnable mới()); Chủ đề chủ đề2 = Chủ đề mới (mới) MyRunnable()); thread1.start(); thread2.start();

Phân tích cảnh

So với việc kế thừa Thread, việc triển khai giao diện Runnable linh hoạt hơn và tránh được những hạn chế của kế thừa đơn lẻ. Trong hầu hết các kịch bản phát triển, phương pháp này được khuyến khích hơn.

Ưu điểm của point point

  • lợi thế: Tách rời logic nhiệm vụ và các đối tượng luồng để linh hoạt hơn.
  • thiếu sót: Yêu cầu tạo thêm Chủ đề vật thể.

3. Triển khai giao diện Callable

Giao diện Callable được giới thiệu trong Java 5 và tương tự như Runnable, nhưng nó hỗ trợ các giá trị trả về và có thể đưa ra các ngoại lệ.

Mã mẫu

nhập java.util.concurrent.Callable; nhập java.util.concurrent.ExecutionException; nhập java.util.concurrent.FutureTask; lớp MyCallable triển khai Callable { @Override public String call() ném ngoại lệ { return "Tên chủ đề: " + Thread.currentThread().getName() + ", việc thực hiện tác vụ đã hoàn thành"; } } public class CallableExample { public static void main(String[] args) ném ExecutionException, InterruptedException { FutureTask FutureTask = new FutureTask<>(new MyCallable()); Thread thread = new Thread(futureTask); result System.out.println("Thread trả về kết quả: " + FutureTask.get());

Phân tích cảnh

Nếu luồng của bạn cần trả về kết quả, Callable là lựa chọn tốt hơn, chẳng hạn như truy vấn dữ liệu, tính toán phức tạp và các tình huống khác.

Ưu điểm của point point

  • lợi thế: Hỗ trợ xử lý giá trị trả về và ngoại lệ, các chức năng mạnh mẽ hơn.
  • thiếu sót: tỷ lệ độ phức tạp của mã Có thể chạy Cao hơn một chút.

4. Sử dụng nhóm luồng

Nhóm luồng là một cơ chế quản lý luồng hiệu quả có thể sử dụng lại các luồng và giảm chi phí tạo và hủy các luồng.

Mã mẫu

nhập java.util.concurrent.ExecutorService; nhập java.util.concurrent.Executors; lớp công khai ThreadPoolExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(3); System.out.println("Tên chủ đề: " + Thread.currentThread().getName() + "Thực thi nhiệm vụ"); for (int i = 0; i < 5; i++) { executorService.execute(task); } executorService.shutdown();

Phân tích cảnh

Thích hợp cho các tình huống yêu cầu tác vụ xử lý đồng thời cao, chẳng hạn như xử lý yêu cầu dịch vụ web.

Ưu điểm của point point

  • lợi thế: Quản lý hiệu quả vòng đời của luồng để tránh việc tạo và giải phóng luồng thường xuyên.
  • thiếu sót: Các tham số của luồng nhóm cần phải được cấu hình phù hợp, nếu không có thể dẫn đến lãng phí tài nguyên.

5. Dịch vụ ScheduleExecutor

ScheduledExecutorService là một cơ chế lập lịch tác vụ theo lịch do Java cung cấp, có thể thực hiện các tác vụ tại thời điểm tốt nhất Định nghĩa hoặc theo định kỳ.

Mã mẫu

nhập java.util.concurrent.Executors; nhập java.util.concurrent.ScheduledExecutorService; nhập java.util.concurrent.TimeUnit; lớp công khai ScheduledExample { public static void main(String[] args) { ScheduledExecutorService Scheduler = Executors.newScheduledThreadPool( 1); Nhiệm vụ có thể chạy = () -> System.out.println("Thời gian hiện tại: " + System.currentTimeMillis()); // Sau khi trì hoãn 1 giây, Scheduler.scheduleAtFixedRate(task, 1, 2) , TimeUnit.SECONDS); trình tắt máy();

Phân tích cảnh

Theo lịch trình, vv

Ưu điểm của point point

  • lợi thế: Dễ dàng thực hiện các nhiệm vụ theo lịch trình và định kỳ.
  • thiếu sót: Không phù hợp với các phương án phức tạp của kịch bản.

6. Sử dụng khung Fork/Join

Fork/Join là một bài hát tính toán khung được giới thiệu trong Java 7, phù hợp để phân tách các tác vụ lớn thành nhiều tác vụ để xử lý bài hát.

Mã mẫu

nhập java.util.concurrent.RecursiveTask; nhập java.util.concurrent.ForkJoinPool; lớp mở rộng SumTask RecursiveTask { int cuối cùng riêng tư bắt đầu, kết thúc; .end = end; } @Override protected Số nguyên tính() { if (end - start <= 10) { int sum = 0; ; i++) { sum += i; } trả về tổng } else { int mid = (bắt đầu + kết thúc) / 2; SumTask mới (bắt đầu, giữa + 1, end); rightTask); return leftTask.join() + rightTask.join(); ForkJoinExample { public static void main(String[] args) { ForkJoinPool pool = new ForkJoinPool(); out.println("Tổng: " + pool.invoke(task));

Phân tích cảnh

Thích hợp để xử lý bài hát số lượng lớn dữ liệu, suy xét như tính toán đệ quy.

Ưu điểm của point point

  • lợi thế: Cải thiện việc sử dụng tối đa CPU.
  • thiếu sót: Không phù hợp với các nhiệm vụ Yêu cầu nhiều I/O.

7. Sử dụng CompleteableFuture

CompleteableFuture là một trình cài đặt công cụ không được cung cấp bởi Java 8. Nó hỗ trợ các chuỗi lệnh gọi và rất phù hợp cho việc phân tách và kết hợp các tác vụ phức tạp.

Mã mẫu

nhập java.util.concurrent.CompletableFuture; lớp công khai CompleteableFutureExample { public static void main(String[] args) { CompleteableFuture.supplyAsync(() -> { System.out.println("Thực hiện nhiệm vụ:" + Thread. currentThread() .getName()); về "kết quả nhiệm vụ" }).thenApply(result -> { System.out.println("Đang xử lý kết quả:" + result); return "Kết quả cuối cùng" }).thenAccept(System.out: :println);

Phân tích cảnh

Thích hợp cho các cuộc gọi chuỗi tác vụ không đồng bộ, nghĩ ra giới hạn như các cuộc gọi dịch vụ từ xa.

Ưu điểm của point point

  • lợi thế: Chức năng mạnh mẽ và mã hóa ngắn gọn.
  • thiếu sót: Chi phí học tập cao hơn.

8. Sử dụng ListenableFuture của ổi

Guava cung cấp ListenableFuture, trợ giúp nâng cao Tương lai và hỗ trợ xử lý gọi lại sau khi hoàn thành nhiệm vụ.

enter com.google.common.util.concurrent.*; nhập java.util.concurrent.Executors; lớp công khai ListenableFutureExample { public static void main(String[] args) { Dịch vụ ListenExecutorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool( 2) ); Future = service.submit(() -> { Thread.sleep(1000); return "Nhiệm vụ đã hoàn thành"; }); Futures.addCallback(tương lai, new FutureCallback() { @Override public void onSuccess(String result) { System.out.println("Task thành công, Kết quả: " + result); } @Ghi đè public void onFailure(Throwable t) { System.out.println( "Tác vụ thất bại: " + t.getMessage()); dịch vụ.shutdown();

Tóm tắt

Trên đây là 8 cách tạo luồng trong Java.

Hãy để tôi tóm tắt những ưu điểm và nhược điểm của từng thời kỳ:

phương pháp Các tình huống áp dụng lợi thế Missing sot
Chủ đề lớp kế thừa nhiệm vụ đơn giản Trực quan và dễ hiểu Chế độ kế hoạch bị hạn chế
Triển khai giao diện Runnable hầu hết các cảnh Linh hoạt và không ảnh hưởng tới quan hệ kế thừa No return value
Triển khai giao diện Callable Tác vụ trả về kết quả hoặc ngoại lệ được đưa ra Return value support Cần hợp tác Nhiệm vụ tương lai sử dụng
Chủ đề nhóm (ExecutorService) Nhiệm vụ có tính đồng thời cao Quản lý kết quả chủ đề Bộ cấu hình phức tạp
Dịch vụ thực thi theo lịch trình định nghĩa nhiệm vụ Dễ dàng thực hiện kế hoạch cài đặt theo lịch trình Không phù hợp với phương án thiết lập phức tạp
Khung Fork/Thăm gia Tính toán dữ liệu bài hát Cải thiện việc sử dụng đa lõi Không phù hợp với các tác vụ I/O chuyên sâu
Hoàn thànhTương lai Cuộc gọi tác vụ chuỗi không đồng bộ Mạnh mẽ Đường cong học tập cao
Tương tự có thể được sửa đổi Tác vụ không được gọi lại Cơ chế gọi lại mạnh mẽ và khả năng mở rộng tốt Giới thiệu các phần phụ thuộc của bên thứ ba

Tôi hy vọng mọi người có thể lựa chọn phương pháp phù hợp theo kịch bản phát triển thực tế.

Tương lai hoàn thành hoặc ListenableFuture for non bộ task, vv

.

Lời cuối cùng muốn nói (xin hãy chú ý đến tôi, đừng bán dâm tôi một cách vô ích)

Nếu bài viết này hữu ích hoặc truyền cảm hứng cho bạn, hãy giúp tôi theo dõi tài khoản công khai cùng tên của tôi: Su San nói về công nghệ.

Vui lòng nhấp vào ba liên kết: thích, chuyển tiếp và xem.

Theo dõi tài khoản công khai: [Su San nói về công nghệ] và trả lời trong tài khoản công khai: Nếu bạn vào một nhà máy lớn, bạn có thể đã nhận được hướng dẫn phỏng vấn miễn phí 100.000 từ trình soạn thảo mới của tôi. Đã mời nhiều nhà máy bằng cách dựa vào hướng dẫn này.

Cuối cùng, bài viết về 8 phương pháp tạo chủ đề mà 90% mọi người không biết ở đây. Nếu bạn muốn biết thêm về 8. tôi hy vọng mong bạn sẽ ủng hộ blog của tôi trong tương lai .

57 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress