Maison > Java > Javacommencer > Résumé de la façon de créer des threads en Java

Résumé de la façon de créer des threads en Java

王林
Libérer: 2020-01-08 16:59:06
avant
2173 Les gens l'ont consulté

Résumé de la façon de créer des threads en Java

1. Hériter de la classe Thread

public class ThreadCreator extends Thread{

    public static void main(String[] args) {
       //第一种方式:
       ThreadCreator creator = new ThreadCreator();
       Thread thread = new Thread(creator,"线程1");
       thread.start();
       //第二种方式:
       Thread thread = new ThreadCreator();
       thread.start();
       //第三种方式:
       new ThreadCreator().start();
   }
 
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "run");
    }
}
Copier après la connexion

2. Implémenter l'interface Runnable

(partage de didacticiel vidéo d'apprentissage gratuit : tutoriel vidéo Java )

public class ThreadCreator implements Runnable{

    public static void main(String[] args) {
       ThreadCreator creator = new ThreadCreator();
       Thread thread = new Thread(creator,"线程1");
       thread.start();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "run");
    }
}
Copier après la connexion

3. Implémentez l'interface appelable

public class ThreadCreator implements Callable<Integer> {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
       ThreadCreator creator = new ThreadCreator();
       FutureTask futureTask = new FutureTask(creator);
       Thread thread = new Thread(futureTask,"线程");
       thread.start();
       System.out.println(futureTask.get());
    }

    @Override
    public Integer call() {
        return 1024;
    }
}
Copier après la connexion

4. Pool de threads ExecutorService

public class ThreadCreator{

   static ExecutorService service = Executors.newFixedThreadPool(5);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //execute无返回值
        service.execute(new ThreadTask(1,"1"));
        //submit有返回值
        Future<Integer> result = service.submit(new ThreadTaskCall());
        System.out.println(result.get());
        service.shutdownNow();
    }
    static class ThreadTask implements Runnable{
        private int param1;
        private String param2;
        public ThreadTask(int param3,String param4){
            this.param1 = param3;
            this.param2 = param4;
        }
        @Override
        public void run() {
            System.out.println(param1+param2);
        }
    }

    static class ThreadTaskCall implements Callable<Integer>{
        @Override
        public Integer call() throws Exception {
            return 1024;
        }
    }
}
Copier après la connexion

La différence entre soumettre et exécuter dans le pool de threads :

(1) Les types de tâches acceptables sont différents : exécuter ne peut accepter que les tâches exécutables, et soumettre peut également accepter les tâches appelables.

(2) Valeur de retour : exécuter n'a pas de valeur de retour Une fois la tâche soumise, les résultats de l'exécution ne peuvent pas être surveillés dans le thread actuel. Submit a une valeur de retour de type Future, qui est utilisée pour recevoir des valeurs de retour ou répondre aux exceptions. Obtenu via la méthode get().

La couche inférieure de submit est toujours appelée exécuter, mais elle est encapsulée avec une future couche sur cette base, et toutes les exceptions générées lors de l'exécution sont encapsulées dans une variable :

public void run() {
        if (state != NEW ||
            !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                         null, Thread.currentThread()))
            return;
        try {
            Callable<V> c = callable;
            if (c != null && state == NEW) {
                V result;
                boolean ran;
                try {
                    result = c.call();
                    ran = true;
                } catch (Throwable ex) {
                    result = null;
                    ran = false;
                    setException(ex);
                }
                if (ran)
                    set(result);
            }
        } finally {
            runner = null;
            int s = state;
            if (s >= INTERRUPTING)
                handlePossibleCancellationInterrupt(s);
        }
    }
protected void setException(Throwable t) {
        if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
            outcome = t;
            UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state
            finishCompletion();
        }
    }
Copier après la connexion

De plus , spring L'annotation de planification utilise la méthode de traitement de soumission pour référence.

5. Classe interne anonyme

public class ThreadCreator {

    public static void main(String[] args) {

        //继承Thread类
        new Thread() {
            @Override
            public void run() {
                System.out.println("extends Thread Class!");
            }
        }.start();
        //实现Runnable接口
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("implement Runnable!");
            }
        }).start();
        //实现Callable接口
        new Thread(new FutureTask<Integer>(new Callable() {
            @Override
            public Integer call() throws Exception {
                return 1024;
            }
        })).start();
        //lambda表达式
        new Thread(() -> System.out.println("execute single code")).start();
        new Thread(() -> {
            System.out.println("execute multiple code");
        }).start();
    }
}
Copier après la connexion

pool de threads lambda :

public class ThreadCreator {

    static ExecutorService service = Executors.newFixedThreadPool(5);

    static List list = new ArrayList();

    public static void main(String[] args) {
        service.execute(() -> execute()); //无返回值
        Future future = service.submit(() -> execute()); //有返回值
        list.add(future);
    }

    public static void execute() {
        //do something
    }
}
Copier après la connexion

Tutoriels d'articles connexes recommandés : Démarrage rapide Java

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal