Après avoir eu des problèmes avec MKDirs () et piquer autour des interwebs, j'ai l'impression qu'il existe des problèmes de sécurité de fil avec MKDirs (). P>
existe-t-il un moyen de s'assurer que les répertoires sont correctement créés lorsqu'il est possible que plusieurs threads pourraient essayer de créer des structures de fichiers similaires? P>
merci p>
(Dans mon cas, je vais utiliser ceci sur Android) P>
5 Réponses :
Une solution possible serait un mkdirservice (illustré ci-dessous) qui garantit qu'une seule instance et s'exécute dans son propre fil. Utilisation de blockingQueue.
premier le service: p> le test: p>
J'accueillerais des corrections à mon exemple, je suis sûr qu'il y a de meilleurs moyens de le faire et de considérer cela une bonne occasion d'apprentissage.
Toutes la création de votre répertoire dans un fil de travailleur qui sertiise tout. Vous pouvez utiliser un LOOPER code> et un
manutention code> pour faciliter la publication
Runnables code> qui appelez mkdirs sur votre fil de travail. Lorsque vous avez terminé de faire des répertoires, vous pouvez appeler looper.Quit () pour mettre fin au fil après avoir traite le dernier message
exécutable code>. Documentation pour
Looper code>
a un code d'exemple montre à quel point cela est proche de cela. p>
Je ne sais pas si Android soutient le paquet simultané, mais voici ma prise: La méthode retourne tôt si le répertoire existe déjà. Si cela n'existe pas, un seul thread va essayer de le créer. P> p>
C'est bien. Cela corrigé mon problème que j'avais avec plusieurs threads tente de créer le même répertoire. Pas sur Android mais dans une application Java 5 régulière.
Oui, c'est plus difficile qu'il n'y paraît.
D'accord, je sais que cela a été inactif pendant un moment, mais je pensais peut-être qu'il y avait une solution simple. L'article que vous avez associé aux commentaires sur la question semble indiquer que le seul problème est que les annuaires pas em> sont créés. La solution Il y avait pour faire cela: Cependant, cela semble inefficace et peut toujours avoir des problèmes. Alors, pourquoi ne pas simplement faire cela: p> simple, mais cela fonctionne. P> EDIT: Après avoir pensé un peu, cet exemple peut être à la traîne à l'oubli et pourrait causer une serrure de fil. Donc, cela pourrait être une meilleure idée: p> bien sûr, ce ne serait recommandé que si vous êtes dans un fil pouvant causer une serrure de fil, et aussi longtemps que c'est pas une situation de haute priorité. Juste mettre cela là-bas. P> p>
... et vraiment, espérons vraiment que cela ne se déroule jamais dans une situation où MKDirs () échoue pour de vraies raisons, comme des problèmes d'autorisations ou un nom de répertoire mal formaté.
@smackfu bon point. Il serait peut-être préférable d'essayer un certain nombre de fois, puis affichez un message d'erreur.
J'avais le problème exact et malheureusement rien de ce qui précède a fonctionné pour moi, mais cela a fonctionné tandis que (! DIR.MKDIRS ()) {if (dir.isdirectory ()) {pause; }} code>
Même si ce fil est un peu plus vieux, je me demande s'il y a quelque chose qui ne va pas avec la solution suivante:
package service; import java.io.File; public class FileService { public static synchronized boolean mkdirs( File dir ) { return dir.mkdirs(); } }
Pourriez-vous fournir des références sur la raison pour laquelle vous pensez
mkdirs () code> n'est pas le fil sûr?
Y a-t-il des détails connus (pour J2SE et Android) dans quelles circonstances apparaîtra ce problème avec une probabilité élevée? Nombre de cœurs CPU, de threads, de système d'exploitation, système de fichiers? J'essaie d'élever ce problème à des fins de test.
@Tedhopp Link est mort? Pouvez-vous relier ou expliquer ce qui était?
@cooton je suis d'accord
mkdirs () code> ne semble pas être synchrone!
@Tedhopp, que ma compréhension concernant plusieurs threads essayant de faire
mkdir () code> est corrige b> ou pas b> non b> que lorsque plusieurs threads sont en cours d'exécution et voulaient créer un Dir laisse dire / données / abc. 1er thread viennent et exécutez la méthode
mkdir () code> maintenant, tandis que le mkdir () est à Procres, le deuxième thread est venu vérifier si Dir existe déjà et est venu savoir qu'il n'exécute pas et exécute
mkdir () code>.
Je pense qu'u
Synchronized-block code> est le bon moyen d'assurer la sécurité du thread-Safety. comme ce
synchronisé (this) {dir.mkdirs ()); } code>
@Muhammadbabar - Je ne sais pas ce qui est arrivé à ce poste et je ne trouve pas de copie via une recherche sur le Web du titre (qui fait partie de l'URL). De plus, avec cela étant de plus de 3 ans après le fait, je ne me souviens pas des points spécifiques du poste. Cependant, je suis exécuté sur Cette discussion < / a> qui a beaucoup à dire sur le sujet. Il s'agit de la mise en œuvre Linux de
mkdirs () code>, mais cela s'applique presque certainement à l'appel Java à Android, car Android est basé sur un noyau Linux.
@Tedhopp ne s'inquiète pas de merci quand même :)