Rumah > Java > javaTutorial > Pembangunan Java: Cara menggunakan multi-threading untuk melaksanakan pemprosesan tugas serentak

Pembangunan Java: Cara menggunakan multi-threading untuk melaksanakan pemprosesan tugas serentak

WBOY
Lepaskan: 2023-09-21 15:03:31
asal
730 orang telah melayarinya

Pembangunan Java: Cara menggunakan multi-threading untuk melaksanakan pemprosesan tugas serentak

Pembangunan Java: Cara menggunakan multi-threading untuk melaksanakan pemprosesan tugas serentak

Pengenalan:
Dalam pembangunan perisian moden, pemprosesan tugas serentak yang cekap adalah penting. Di Jawa, multithreading ialah cara biasa dan berkuasa untuk melaksanakan pemprosesan tugas serentak. Artikel ini akan memperkenalkan anda kepada cara menggunakan multithreading untuk melaksanakan pemprosesan tugas serentak, dengan contoh kod khusus.

  1. Cara asas untuk mencipta utas
    Di Java, anda boleh mencipta utas dengan mewarisi kelas Thread atau melaksanakan antara muka Runnable. Berikut ialah contoh kod untuk dua kaedah:

Kaedah 1: Warisi kelas Benang

public class MyThread extends Thread {
    public void run() {
        // 在这里写入线程运行时需要执行的代码
    }
}

// 创建并启动线程
MyThread myThread = new MyThread();
myThread.start();
Salin selepas log masuk

Kaedah 2: Laksanakan antara muka Runnable

public class MyRunnable implements Runnable {
    public void run() {
        // 在这里写入线程运行时需要执行的代码
    }
}

// 创建并启动线程
Thread thread = new Thread(new MyRunnable());
thread.start();
Salin selepas log masuk
  1. Gunakan kumpulan benang untuk mengurus benang
    Dalam aplikasi sebenar mungkin menyebabkan, secara langsung mencipta benang sumber sistem sisa. Untuk pengurusan benang yang lebih baik, kumpulan benang boleh digunakan. Java menyediakan kelas ThreadPoolExecutor, yang boleh membuat kumpulan benang dan mengurus benang di dalamnya dengan mudah. Berikut ialah kod sampel menggunakan kumpulan benang:
ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建线程池,指定线程数量为5

for (int i = 0; i < 10; i++) {
    executorService.execute(new MyRunnable()); // 提交任务给线程池执行
}

executorService.shutdown(); // 关闭线程池
Salin selepas log masuk

Dalam kod sampel di atas, kami telah mencipta kumpulan benang dengan saiz tetap 5. Kemudian, kami menyerahkan 10 tugasan ke kumpulan benang untuk dilaksanakan dalam satu gelung. Akhir sekali, kami memanggil kaedah shutdown() untuk menutup kumpulan benang.

  1. Melaksanakan komunikasi antara tugas serentak
    Selalunya sangat penting untuk melaksanakan komunikasi antara utas. Java menyediakan pelbagai cara untuk melaksanakan komunikasi antara benang, yang paling biasa menggunakan pembolehubah kongsi dan kaedah tunggu() dan notify().

Gunakan pembolehubah kongsi:

public class SharedData {
    private int count;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

SharedData sharedData = new SharedData();

// 创建并启动多个线程
for (int i = 0; i < 10; i++) {
    Thread thread = new Thread(() -> {
        sharedData.increment();
    });
    thread.start();
}

// 等待所有线程执行完毕
Thread.sleep(1000);

System.out.println(sharedData.getCount()); // 输出结果应为10
Salin selepas log masuk

Gunakan tunggu(), maklumkan() kaedah:

public class Message {
    private String content;
    private boolean isEmpty = true;

    public synchronized String take() {
        while (isEmpty) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        isEmpty = true;
        notifyAll();
        return content;
    }

    public synchronized void put(String content) {
        while (!isEmpty) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        isEmpty = false;
        this.content = content;
        notifyAll();
    }
}

Message message = new Message();

// 创建并启动多个线程
Thread producerThread = new Thread(() -> {
    for (int i = 0; i < 10; i++) {
        message.put("Message " + i);
        Thread.sleep(1000);
    }
});

Thread consumerThread = new Thread(() -> {
    for (int i = 0; i < 10; i++) {
        System.out.println(message.take());
        Thread.sleep(1000);
    }
});

producerThread.start();
consumerThread.start();
Salin selepas log masuk
  1. Kawalan penyegerakan antara utas
    Pelaksanaan serentak beberapa utas boleh menyebabkan masalah keselamatan utas, untuk mengelakkan masalah kata kunci disegerakkan, antara muka Kunci dan kaedah lain digunakan untuk menyegerakkan kod kunci. Berikut ialah contoh penggunaan kata kunci yang disegerakkan:
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized void decrement() {
        count--;
    }

    public synchronized int getCount() {
        return count;
    }
}

Counter counter = new Counter();

// 创建并启动多个线程
Thread incrementThread = new Thread(() -> {
    for (int i = 0; i < 1000; i++) {
        counter.increment();
    }
});

Thread decrementThread = new Thread(() -> {
    for (int i = 0; i < 1000; i++) {
        counter.decrement();
    }
});

incrementThread.start();
decrementThread.start();

incrementThread.join();
decrementThread.join();

System.out.println(counter.getCount()); // 输出结果应为0
Salin selepas log masuk

Kesimpulan:
Menggunakan multi-threading boleh mencapai pemprosesan tugas serentak dengan berkesan. Dalam artikel ini, kami memperkenalkan cara membuat utas, menggunakan kumpulan benang, melaksanakan komunikasi antara utas dan menyegerakkan kawalan antara utas dan menyediakan contoh kod khusus. Saya harap kandungan ini akan membantu anda dalam menggunakan multi-threading untuk melaksanakan pemprosesan tugas serentak dalam pembangunan Java!

Atas ialah kandungan terperinci Pembangunan Java: Cara menggunakan multi-threading untuk melaksanakan pemprosesan tugas serentak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan