Partie multithreadée Java (huit brins de base)

Ordinaryblog 2022-01-15 02:50:26 阅读数:265

partie multithread java huit brins

Méthode de mise en œuvre du Multithreading(3Espèce):

  • RéalisationRunnableInterface
  • SuccessionThreadCatégorie
  • RéalisationCallableInterface

La différence:

  • CallablePeut avoir une valeur de retour,Vous pouvez également lancer une exception,EtrunnableNon.
  • SuccessionThreadLa classe doit être réécriterunMéthodes,run La méthode doit être découplée de la création du fil , Cette méthode est très couplée
  • SuccessionThreadClasse pour implémenter, Créer une nouvelle tâche à la fois , Vous ne pouvez créer qu'un nouveau thread autonome , Créer un nouveau thread indépendant , Les pertes sont plus importantes .EtRunnable Vous pouvez utiliser des outils tels que threadpool , Réduit la perte de création et de destruction de threads
  • Java Double héritage non pris en charge ,HéritéThread La classe ne peut pas hériter d'autres classes plus tard

Un thread appelle deux foisstart()Et la méthode??

Une exception d'état de thread sera signalée .La raison en est que:start La méthode vérifie d'abord l'état du fil au démarrage

startSignification de la méthode:

(1)Démarrer un nouveau thread,Notificationjvm Démarrer un nouveau thread au ralenti
(2)Appel du fil principal

startProcessus de démarrage de la méthode:

  • Démarrer un nouveau thread pour vérifier l'état du thread
  • Rejoindre un groupe de Threads
  • Appelezstart0()

Comment arrêter correctement le fil?

  • Utiliserinterrupt Pour demander l'arrêt du fil
  • Utiliserinterrupt Est utilisé pour aviser le thread d'arrêter ,Ce n'est pas obligatoire
  • Pour arrêter le thread , Le demandeur est requis 、 Partie arrêtée 、 Les appelants de sous - Méthodes coopèrent entre eux
  • UtiliservolatileParamètresbooleanTag bit:Volatile En cas de blocage du fil , Impossible de mettre à jour instantanément , Ce n'est donc pas souhaitable
  • AvecstopArrêter le fil, Provoque un arrêt soudain du thread à mi - chemin , Il n'y a aucun moyen de faire fonctionner une unit é de base , Données sales (Obsolète)
  • suspend: Le fil est suspendu , Mais ne libère pas sa propre serrure ,Facile à bloquer(Obsolète)

Attention!:InwhileUtilisé danstry/catch,L'interruption peut échouer

Comment gérer les blocages non interruptibles?

Tout d'abord,, Il n'existe pas de méthode uniforme pour cette méthode. .
D'habitude, on peut :SuccessionthreadCatégorie Outrepasser la méthode originale d'interruption du fil ou d'annulation de la tâche , Ajoutez votre propre annulation à la méthode , Comme fermer le flux de données , Fermeture de la prise, etc , Puis appelez la méthode d'interruption de la classe mère , Cela permet à la fois de fermer les tâches bloquées , Encore une interruption de fil .

État de vie du fil:

 Citation de l'image du professeur Wukong de muxue.com

Pourquoiwait()Doit être utilisé dans le bloc de code de synchronisation,Etsleep()Pas besoin.?

Pour rendre la communication fiable , Empêcher l'impasse ou l'attente permanente ,wait() Nécessite une interaction entre les fils

waitEtsleepSimilitudes et différences de méthodes

  • Même chose.:
    waitEtsleep Les deux méthodes peuvent bloquer le fil ,L'état du fil correspondant est WaitingOuTime_Waiting
    waitEtsleep Les méthodes peuvent répondre aux interruptions Thread.interrupt

  • C'est différent.:
    wait La méthode doit être exécutée dans un bloc de code de synchronisation ,EtsleepPas besoin de
    Exécuter en mode synchrone sleepHeure,Pas de libérationmonitorVerrouillage,MaiswaitLa méthode libère
    sleep Méthodes après une brève hibernation, l'occlusion se retirera activement. ,Etwait La méthode doit être réveillée par un autre thread
    wait()Etnotify(),notifyAll()- Oui.ObjectMéthode de la classe,sleep()Etyield()- Oui.ThreadMéthode de la classe

Pourquoiwait.notifyEtnotifyAllDéfini comme étantObjectClasse,EtsleepDéfini dansThreadClasse?

Wait() Attendre est une opération de niveau de verrouillage , La serrure appartient à un objet .( Chaque objet a plusieurs bits dans l'en - tête de l'objet pour enregistrer l'état de la serrure courante ) La serrure est liée à un objet , Pas dans le fil .Défini dansThreadAprès, Impossible d'implémenter l'état de plusieurs serrures pour un thread

joinMéthodes

  • Action: Le thread principal attend l'exécution du sous - thread
  • InjoinPériode,Le thread estWaitingStatut

yieldMéthodes

  • Action: Pour libérer ce thread CPUFilm temporel
  • Le fil libéré est RunnableStatut

La différence entre un Thread de démon et un thread normal

  • Aucune différence dans l'ensemble
  • Le thread utilisateur affecte JVMSortie de Les fils de démon ne
  • Les Threads utilisateurs exécutent la logique du développeur , Les fils du démon sont à notre service

Avez - vous besoin de penser à définir le thread démon pour le thread:

Le thread utilisateur ne doit pas être défini comme un thread démon , Les données peuvent être incohérentes , Erreur dans des énigmes telles que la résiliation forcée du programme

runLa méthode peut - elle lancer une exception

run La méthode ne peut pas être lancée par elle - même ,Ne peut être utilisé que par soi - mêmetry/catchJetez Le thread met fin à l'exécution de la pile de processus de sortie .L'état estWaiting
Insérer la description de l'image ici
Deux façons de résoudre l'évasion :

  • Retour”Copie“
  • Mode usine: Après l'exécution complète du constructeur , Ensuite, donnez l'objet à l'accès extérieur

Insérer la description de l'image ici

Pourquoi le Multithreading cause des problèmes de performance?

Insérer la description de l'image ici

版权声明:本文为[Ordinaryblog]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201080600349860.html