- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
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].
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().
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();
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.
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.
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();
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.
Chủ đề
vật thể.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ệ.
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());
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.
Có thể chạy
Cao hơn một chút.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.
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();
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.
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ỳ.
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();
Theo lịch trình, vv
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.
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));
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.
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.
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);
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.
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();
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
.
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 .
Lời nói đầu: Đôi khi, một cơ sở dữ liệu có nhiều tài khoản, bao gồm cơ sở dữ liệu quản trị viên, nhà phát hiện phát triển, nhân viên hỗ trợ vận hành và bảo trì, vv Có thể có nhiều tài khoản có quyền tương đối, ví dụ như if you có nhiều tài khoản, hãy quản lý
Gần đây, chúng tôi bắt đầu sử dụng Storybook để làm việc và tạo ra các thành phần. Thật tuyệt vời. ứng dụng, chúng tôi liên tục gặp phải
Làm theo đoạn mã cho điều khiển mà tôi đang tạo. khác nhau. giá trị gần {{}}.
Tôi đang cố gắng tạo một lớp nhà cung cấp hình ảnh/jpeg jax-rs để tạo hình ảnh cho dịch vụ web dựa trên phần còn lại bài đăng lại của tôi. @BƯU KIỆN
Tôi đã thực hiện hành động trong trình giả lập cài đặt của Windows 10. Sau đây tôi chuyển sang dev C++ IDE. tên là test.txt và tôi đã đặt một tên khác.
Mode không bằng initWithFrame hoặc initWithCode. Khi chúng tôi tạo customUITable.
Tôi đang cố gắng tạo một chuỗi cho chức năng *Producer nhưng dòng được sử dụng để tạo ra lỗi chuỗi. #include #include #include
Vì vậy, tôi Bing Mình &
Chuỗi ký tên Chuỗi ký hiệu được tạo và sử dụng.
Lời nói đầu: Tôi không biết nhiều về cách phát triển cơ sở các tác vụ trong C#, chỉ biết cách sử dụng chúng vì bất kỳ lỗi nào. điều gì tôi đã nêu dưới đây: Tôi không thể tìm thấy câu trả lời hay cho câu hỏi "Làm cách nào tôi có thể bắt đầu một nhiệm vụ mà không phải chờ đợi?" Trong C#. Cụ thể hơn, ngay cả khi có
Tôi có ILookup được tạo bởi một số phức tạp biểu thức. giới đơn giản của chúng tôi, họ là duy nhất trong các gia đình) ILookup gia đình Bây giờ tôi có hai truy vấn mà tôi quan tâm đến cách xây dựng cái đầu
Tôi đang cố gắng tạo một MSI có chứa và gói tùy chọn được sử dụng trong WIX. Ai có thể giúp tôi giải quyết vấn đề này. Đây là mã: lỗi LGH
Trong Yii, Tạo và cập nhật thường xuyên sử dụng cùng một biểu thức. vv trong quá trình tạo, nhưng tôi không muốn hiển thị các email và mật khẩu cụ thể khi cập nhật, nhưng
Tuần trước tôi đã gặp khó khăn với việc tạo QModelIndex cho một hàng và một cột. Ngoài ra, tôi sẽ sẵn sàng thay đổi giá value of row() in QModelIndex đã tồn tại.
Const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
df 5),
hôm nay, tôi nghĩ đến Vì vậy, tôi đã tạo một tệp .vimrc. Tôi sử dụng touch .vimrc cat /etc/vim/vimrc > .vimrc vậy
Tôi không thể tạo MKAnnotation hay nó chỉ ở chế độ đọc? thủ công bằng setCooper. ý tưởng? Câu trả lời hay nhấtMKChú thích
Trong đoạn mã sau, câu lệnh nhật ký đầu tiên hiển thị số thập phân như mong đợi, nhưng câu lệnh nhật ký thứ hai lại ghi bằng NULL. Tôi đã làm gì sai? NSDictionary *entry = [[NSDictionary alloc] initWithOb
Tôi đang sử dụng mã tương tự như thế này để tự động thêm vào một mảng; $arrayF[$f+1][$y][$x+1] = $value+1; phần bù không xác định: 1 Câu hỏi: Hãy thử tạo
Tôi là một lập trình viên xuất sắc, rất xuất sắc!