java - 异步情况下的循环,怎么解决这个问题
PHPz
PHPz 2017-04-18 10:08:52
0
6
481
PHPz
PHPz

学习是最好的投资!

répondre à tous(6)
伊谢尔伦

Utiliser des synchronizedmots-clés

左手右手慢动作

Ajouter le mot-clé volatile à la liste

阿神

Je viens de regarder aujourd'hui la programmation simultanée pratique sur la libération et l'accès sécurisés aux objets mutables :
Libération sécurisée :

  1. Initialiser une référence d'objet dans une fonction d'initialisation statique

  2. Enregistrer la référence de l'objet sur volatile ou AtomicReference

  3. Enregistrer la référence de l'objet à un type final qui construit correctement l'objet

  4. Enregistrez l'objet dans le cadre d'un verrou.

Accès sécurisé :

  1. Discussion fermée

  2. Partage en lecture seule

  3. Partage thread-safe, la méthode d'accès interne de l'objet publié est thread-safe, et aucune synchronisation externe n'est requise

  4. Protégez les objets, publiez des objets mutables en limitant l'accès externe et spécifiez l'interface d'accès aux objets mutables.

static List<String> arrayList = new ArrayList<>();Cela est conforme à la première règle de publication sécurisée
Ensuite, nous devons garantir un accès sécurisé Puisque la liste ne doit pas être accessible en toute sécurité dans les trois premières situations, nous ne pouvons compter que sur la restriction du monde extérieur lorsque. publier des objets, c'est-à-dire verrouiller.

洪涛

Cela peut être réalisé selon la demande du sujet, mais la réalisation de cette demande est très étrange.

    private static void test1(final int i) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (arrayList) {
                while (arrayList.size() != i) {
                    try {
                        arrayList.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                arrayList.add(i, i + "position");
                arrayList.notifyAll();
            }
        }
    }).start();
}

En plus de cette méthode, cela peut également être réalisé par join et en passant countdownlatch Si vous voulez vraiment être comme le sujet, il vaut mieux ne pas utiliser le multi-threading

.
Peter_Zhu

L'utilisation de la méthode InvokeAll du pool de threads peut garantir que l'ordre des résultats est cohérent avec l'ordre des paramètres transmis

黄舟
public static void main(String[] args) {
        ExecutorService exec = Executors.newFixedThreadPool(10);
        
        List<Callable<Integer>> list = new ArrayList<>();
        
        for (int i = 0; i < 10; i++) {
            list.add(newTask(i));
        }
        
        try {
            for (Future<Integer> future : exec.invokeAll(list)) {
                try {
                    System.out.println(future.get());
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        exec.shutdown();
    }
    
    static Callable<Integer> newTask(final int t) {
        return new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("newTask: " + t);
                try {
                    Thread.sleep((10 - t) * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return t;
            }
        }
    }
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!