Maison >Java >javaDidacticiel >Résumé des méthodes de programmation multithread Java (avec exemples)

Résumé des méthodes de programmation multithread Java (avec exemples)

不言
不言original
2018-09-27 14:38:442124parcourir

Cet article vous présente un résumé des méthodes d'implémentation multi-thread Java (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Quand utiliser la programmation multithread

Une tâche est exécutée séquentiellement dans des circonstances normales, mais s'il existe plusieurs blocs de processus similaires dans la tâche en cours (comme les instructions for, while) , nous pouvons envisager d'extraire ces blocs de code pour les exécuter en parallèle sans bloquer

2 Plusieurs façons d'implémenter le multi-threading

L'une consiste à hériter de la classe Thread et à réécrire la méthode run, et la. autre La première consiste à implémenter l'interface Runnable et à réécrire la méthode d'exécution

Dans de nombreux cas, démarrer plusieurs threads consiste à gérer des processus simultanés. performances temporelles, nous pouvons également implémenter des files d'attente.

3. Exemple

Hérite du fil de discussion

/**
 * 
* @ClassName: ThreadByEx  
* @Description: TODO
* @author Mr.jqCheng
* @date 2018年9月26日  
* */public class ThreadByEx extends Thread{

    @Override    public void run() {        // TODO Auto-generated method stub
        System.out.println("我是继承线程");
    }

}

Implements Runnable

/**
 * 
* @ClassName: ThreadByRunnable  
* @Description: TODO
* @author Mr.jqCheng
* @date 2018年9月26日  
* */public class ThreadByRunnable implements Runnable{    /*public ThreadByRunnable() {
        this.run();
        // TODO Auto-generated constructor stub
    }*/

    public void run() {        // TODO Auto-generated method stub
        System.out.println("我是实现进程");
    }

}

Test :

/**
 * 
* @ClassName: Test  
* @Description: TODO
* @author Mr.jqCheng
* @date 2018年9月26日  
* */public class Test {    public static void main(String[] args) {        // 继承Thread启动的方法
        ThreadByEx t1 = new ThreadByEx();
        t1.start();// 启动线程        // 实现Runnable启动线程的方法
        ThreadByRunnable r = new ThreadByRunnable();
        Thread t2 = new Thread(r);
        t2.start();// 启动线程        //new ThreadByRunnable();    }

}

Exécution des résultats :

Je suis un thread d'héritage
Je suis un processus d'implémentation

ok, l'implémentation multi-thread simple est terminée Lorsque start() est appelé, le processus est entré dans l'exécutable. state , en attente de l'exécution du système.

Plusieurs méthodes courantes de traitement des threads :

void interrompu() : Envoie une demande d'interruption au thread, l'état d'interruption du thread sera défini sur true, si le thread actuel est bloqué par un appel sleep , une exception interrompue sera levée.

static boolean interrompu() : Teste si le thread actuel (le thread exécutant actuellement la commande) est interrompu. Notez qu'il s'agit d'une méthode statique. L'appel de cette méthode aura un effet secondaire, c'est-à-dire qu'elle réinitialisera l'état d'interruption du thread actuel sur false.

boolean isInterrupted() : Détermine si le thread a été interrompu. L'appel de cette méthode n'aura pas d'effets secondaires, c'est-à-dire qu'il ne modifiera pas l'état d'interruption actuel du thread.

static Thread currentThread() : renvoie l'objet Thread représentant le thread d'exécution actuel.

Le processus démon

est utilisé pour servir tous les threads sous tous les autres processus actuels qui ne sont pas des processus de service

Implémentez simplement deamon.setDaemon(true), avant que le thread ne soit démarré Activer

Exemple

package com.orange.util;
/**
 * 
 * @ClassName: Test
 * @Description: TODO
 * @author Mr.jqCheng
 * @date 2018年9月26日
 *
 */
public class Test {
    public static void main(String[] args) {
        Thread deamon2 = new Thread(new DaemonRunner2(), "otherRunner");
        deamon2.start();// 启动线程
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Thread deamon = new Thread(new DaemonRunner(), "DaemonRunner");
        // 设置为守护线程
        deamon.setDaemon(true);
        deamon.start();// 启动线程
    }
    static class DaemonRunner implements Runnable {
        public void run() {
            // TODO Auto-generated method stub
            try {
                Thread.sleep(300);
                Thread t = Thread.currentThread();
                System.out.println(t);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("进入守护线程,说明现在还有其他线程在执行");
            }
        }
    }
    static class DaemonRunner2 implements Runnable {
        public void run() {
            // TODO Auto-generated method stub
            try {
                Thread.sleep(1500);
                System.out.println("我是其他线程");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Résultat de l'exécution :

Thread[DaemonRunner,5,main]
entre dans le thread démon, indiquant qu'il y a d'autres threads en cours d'exécution
Je suis un autre thread

Tout d'abord, démarrez d'autres threads, ce qui prend 1 500 ms. En même temps, après que le thread principal ait pris 1 000 ms, il commence à entrer dans le thread démon. toujours en cours d'exécution. En ce qui concerne le thread démon, cela prend 300 ms, d'autres threads sont toujours en cours d'exécution, continuez vers le bas, le thread démon est exécuté

Mais si je change les 300 ms du thread démon en 500 ms, que se passera-t-il ?

Il y a eu deux situations. Après tout, à la valeur critique

1 Je suis un autre fil

2. entre dans le thread démon, indiquant qu'il y a d'autres threads en cours d'exécution
Je suis un autre thread

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