Maison >Java >javaDidacticiel >Comment implémenter la programmation concurrente à l'aide de sémaphores en Java ?

Comment implémenter la programmation concurrente à l'aide de sémaphores en Java ?

王林
王林original
2024-05-01 09:33:021186parcourir

La programmation simultanée en Java peut contrôler l'accès aux ressources partagées à l'aide de sémaphores. Les étapes spécifiques incluent : créer un sémaphore, obtenir le sémaphore (continuer si disponible, sinon bloquer) et libérer le sémaphore. Dans un cas pratique, un sémaphore est utilisé pour contrôler l'accès à l'imprimante, permettant à un seul thread d'imprimer à la fois.

如何使用 Java 中的信号量实现并发编程?

Comment implémenter la programmation concurrente à l'aide de sémaphores en Java

En Java, un sémaphore est une primitive de programmation concurrente qui nous permet de contrôler l'accès aux ressources partagées. Les sémaphores sont implémentés en maintenant un compteur qui représente la quantité disponible d'une ressource. Lorsqu'un thread doit accéder à une ressource, il tentera d'acquérir le sémaphore. Si le sémaphore est disponible, le thread peut continuer son exécution. Sinon, le thread sera bloqué jusqu'à ce que le sémaphore soit disponible.

Implémentation du sémaphore

La classe Semaphore en Java fournit une implémentation d'un sémaphore. Nous pouvons créer un sémaphore en suivant les étapes suivantes : Semaphore 类提供了一个信号量的实现。我们可以使用以下步骤创建一个信号量:

import java.util.concurrent.Semaphore;

public class MySemaphore {

    private Semaphore semaphore;

    public MySemaphore(int permits) {
        semaphore = new Semaphore(permits);
    }

    public void acquire() throws InterruptedException {
        semaphore.acquire();
    }

    public void release() {
        semaphore.release();
    }
}

实战案例

考虑以下场景:我们有一个共享的打印机,并且有多个线程需要使用它。为了防止线程同时访问打印机,我们将使用信号量来控制对打印机的访问。

import java.util.concurrent.Semaphore;

public class Printer {

    private Semaphore semaphore = new Semaphore(1);

    public void print(String document) {
        try {
            semaphore.acquire();
            // 打印文档
        } finally {
            semaphore.release();
        }
    }
}

public class Main {

    public static void main(String[] args) {
        Printer printer = new Printer();

        Thread thread1 = new Thread(() -> printer.print("Document 1"));
        Thread thread2 = new Thread(() -> printer.print("Document 2"));

        thread1.start();
        thread2.start();
    }
}

在这个示例中,我们创建了一个 Printer 类,该类包含一个 Semaphore 实例。print 方法使用 acquire 方法获取信号量,仅当信号量可用时才允许线程继续执行。最后,releaserrreee

🎜Exemple pratique🎜🎜🎜Considérez le scénario suivant : Nous avons une imprimante partagée et plusieurs threads doivent l'utiliser. Pour empêcher les threads d'accéder à l'imprimante en même temps, nous utiliserons un sémaphore pour contrôler l'accès à l'imprimante. 🎜rrreee🎜Dans cet exemple, nous créons une classe Printer qui contient une instance Semaphore. La méthode print utilise la méthode acquire pour acquérir le sémaphore, permettant au thread de continuer à s'exécuter uniquement si le sémaphore est disponible. Enfin, la méthode release libère le sémaphore une fois l'impression terminée afin que d'autres threads puissent utiliser l'imprimante. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn