Analisis senario dan langkah berjaga-jaga aplikasi Java multi-threading
Dengan peningkatan berterusan kuasa pemprosesan komputer, semakin banyak aplikasi perlu mengendalikan berbilang tugas pada masa yang sama. Untuk memanfaatkan sepenuhnya kelebihan prestasi pemproses berbilang teras, Java menyediakan mekanisme pengaturcaraan berbilang benang supaya pelbagai tugas boleh dilaksanakan secara selari. Artikel ini akan menganalisis senario aplikasi dan langkah berjaga-jaga bagi Java multi-threading, dan memberikan contoh kod khusus.
1. Senario aplikasi berbilang benang Java
class RequestHandler implements Runnable { private final int requestNo; public RequestHandler(int requestNo) { this.requestNo = requestNo; } @Override public void run() { // 进行具体的请求处理逻辑 System.out.println("开始处理第" + requestNo + "个请求"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("第" + requestNo + "个请求处理完成"); } } public class Main { public static void main(String[] args) { for (int i = 1; i <= 10; i++) { Thread requestThread = new Thread(new RequestHandler(i)); requestThread.start(); } } }
class UserInputHandler implements Runnable { @Override public void run() { // 处理用户输入逻辑 } } class GUIUpdater implements Runnable { @Override public void run() { // 更新GUI界面逻辑 } } public class Main { public static void main(String[] args) { Thread userInputThread = new Thread(new UserInputHandler()); userInputThread.start(); Thread guiUpdateThread = new Thread(new GUIUpdater()); guiUpdateThread.start(); } }
import java.util.Random; class CalculationTask implements Runnable { private final int[] data; public CalculationTask(int[] data) { this.data = data; } @Override public void run() { // 执行计算逻辑 int sum = 0; for (int num : data) { sum += num; } System.out.println("子任务计算结果:" + sum); } } public class Main { public static void main(String[] args) { int[] data = new int[10000]; Random random = new Random(); for (int i = 0; i < data.length; i++) { data[i] = random.nextInt(100); } int numThreads = 4; // 将任务分割成多个子任务并行执行 Thread[] threads = new Thread[numThreads]; int subTaskSize = data.length / numThreads; for (int i = 0; i < numThreads; i++) { int startIndex = i * subTaskSize; int endIndex = (i == numThreads - 1) ? data.length : i * subTaskSize + subTaskSize; int[] subTaskData = Arrays.copyOfRange(data, startIndex, endIndex); threads[i] = new Thread(new CalculationTask(subTaskData)); threads[i].start(); } // 等待所有子任务执行完成 for (Thread thread : threads) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } }Komunikasi utas: Berbilang benang boleh berkomunikasi antara satu sama lain melalui menunggu, pemberitahuan dan bangun. Penyegerakan dan komunikasi antara benang boleh dicapai menggunakan wait() dan notify() atau menggunakan baris gilir menyekat kelas pengumpulan serentak.
class Counter { private int count; public synchronized void increment() { count++; } public synchronized int getCount() { return count; } } public class Main { public static void main(String[] args) { Counter counter = new Counter(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { counter.increment(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 10000; i++) { counter.increment(); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("计数器的值:" + counter.getCount()); } }
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this.queue = queue; } @Override public void run() { try { for (int i = 1; i <= 10; i++) { String message = "消息" + i; queue.put(message); System.out.println("生产者产生消息:" + message); } } catch (InterruptedException e) { e.printStackTrace(); } } } class Consumer implements Runnable { private final BlockingQueue<String> queue; public Consumer(BlockingQueue<String> queue) { this.queue = queue; } @Override public void run() { try { while (true) { String message = queue.take(); System.out.println("消费者消费消息:" + message); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class Main { public static void main(String[] args) { BlockingQueue<String> queue = new LinkedBlockingQueue<>(); Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); consumerThread.start(); } }
Atas ialah kandungan terperinci Analisis langkah demi langkah bagi senario dan langkah berjaga-jaga penggunaan Java multi-threading. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!