Multithreading en Java és un procés d'execució de diversos fils simultàniament.
Un fil és un subprocés lleuger, la unitat de processament més petita. Multiprocessament i multithreading, tots dos s'utilitzen per aconseguir la multitasca.
multiplicació matricial en c
Tanmateix, fem servir el multiprocés que el multiprocessament perquè els fils utilitzen una àrea de memòria compartida. No assignen una àrea de memòria separada, de manera que estalvien memòria i el canvi de context entre els fils triga menys temps que el procés.
Java Multithreading s'utilitza principalment en jocs, animació, etc.
Avantatges de Java Multithreading
1) Això no bloqueja l'usuari perquè els fils són independents i podeu realitzar diverses operacions alhora.
2) Tu pot realitzar moltes operacions juntes, de manera que estalvia temps .
3) Els fils són independent , de manera que no afecta altres fils si es produeix una excepció en un sol fil.
Multitasca
La multitasca és un procés d'execució de diverses tasques simultàniament. Utilitzem la multitasca per utilitzar la CPU. La multitasca es pot aconseguir de dues maneres:
- Multitasca basada en processos (multiprocessament)
- Multitasca basada en fils (multithreading)
1) Multitasca basada en processos (multiprocessament)
- Cada procés té una adreça a la memòria. En altres paraules, cada procés assigna una àrea de memòria separada.
- Un procés és pesat.
- El cost de la comunicació entre el procés és alt.
- El canvi d'un procés a un altre requereix un temps per desar i carregar registres , mapes de memòria, actualització de llistes, etc.
2) Multitasca basada en fils (multithreading)
- Els fils comparteixen el mateix espai d'adreces.
- Un fil és lleuger.
- El cost de comunicació entre el fil és baix.
Nota: cal com a mínim un procés per a cada fil.
Què és Thread en java
Un fil és un subprocés lleuger, la unitat de processament més petita. És un camí d'execució independent.
Els fils són independents. Si hi ha una excepció en un fil, no afectarà altres fils. Utilitza una àrea de memòria compartida.
Com es mostra a la figura anterior, s'executa un fil dins del procés. Hi ha un canvi de context entre els fils. Hi pot haver diversos processos dins del sistema operatiu i un procés pot tenir diversos fils.
Nota: Al mateix temps, només s'executa un fil.
Classe Java Thread
Java proporciona Classe de fil per aconseguir la programació de fils. La classe de fil proporciona constructors i mètodes per crear i realitzar operacions en un fil. La classe de fil s'estén Classe d'objectes i implementa la interfície Runnable.
Mètodes de fil de Java
S.N. | Modificador i tipus | Mètode | Descripció |
---|---|---|---|
1) | buit | començar() | S'utilitza per iniciar l'execució del fil. |
2) | buit | correr() | S'utilitza per fer una acció per a un fil. |
3) | buit estàtic | dormir () | Dormenta un fil durant la quantitat de temps especificada. |
4) | Fil estàtic | currentThread() | Retorna una referència a l'objecte de fil que s'està executant actualment. |
5) | buit | uneix-te () | Espera que mori un fil. |
6) | int | getPriority() | Torna la prioritat del fil. |
7) | buit | setPriority() | Canvia la prioritat del fil. |
8) | Corda | getName() | Retorna el nom del fil. |
9) | buit | setName() | Canvia el nom del fil. |
10) | llarg | getId() | Retorna l'identificador del fil. |
11) | booleà | està viu() | Comprova si el fil està viu. |
12) | buit estàtic | rendiment () | Fa que l'objecte de fil que s'està executant actualment s'atura i permet que altres fils s'executin temporalment. |
13) | buit | suspendre () | S'utilitza per suspendre el fil. |
14) | buit | resum() | S'utilitza per reprendre el fil suspès. |
15) | buit | Atura() | S'utilitza per aturar el fil. |
16) | buit | destruir () | S'utilitza per destruir el grup de fils i tots els seus subgrups. |
17) | booleà | isDaemon() | Comprova si el fil és un fil de dimoni. |
18) | buit | setDaemon() | Marca el fil com a dimoni o fil d'usuari. |
19) | buit | interrompre () | Interromp el fil. |
20) | booleà | està interromput () | Comprova si el fil s'ha interromput. |
21) | booleà estàtic | interromput () | Comprova si el fil actual s'ha interromput. |
22) | int estàtic | activeCount() | Retorna el nombre de fils actius al grup de fils actuals. |
23) | buit | checkAccess() | Determina si el fil que s'executa actualment té permís per modificar el fil. |
24) | booleà estàtic | holdLock() | Retorna true si i només si el fil actual manté el bloqueig del monitor a l'objecte especificat. |
25) | buit estàtic | dumpStack() | S'utilitza per imprimir un rastre de pila del fil actual al flux d'error estàndard. |
26) | StackTraceElement[] | getStackTrace() | Retorna una matriu d'elements de traça de pila que representen l'abocament de pila del fil. |
27) | int estàtic | enumerar() | S'utilitza per copiar el grup de fils de cada fil actiu i el seu subgrup a la matriu especificada. |
28) | Fil.Estat | getState() | S'utilitza per retornar l'estat del fil. |
29) | Grup de fils | getThreadGroup() | S'utilitza per retornar el grup de fils al qual pertany aquest fil |
30) | Corda | toString() | S'utilitza per retornar una representació de cadena d'aquest fil, inclòs el nom, la prioritat i el grup de fils. |
31) | buit | notificar () | S'utilitza per donar la notificació d'un sol fil que està esperant un objecte concret. |
32) | buit | notifyAll() | S'utilitza per donar la notificació a tots els fils d'espera d'un objecte concret. |
33) | buit | setContextClassLoader() | Estableix el context ClassLoader per al fil. |
34) | ClassLoader | getContextClassLoader() | Retorna el context ClassLoader per al fil. |
35) | Thread.UncaughtExceptionHandler estàtic | getDefaultUncaughtExceptionHandler() | Retorna el controlador predeterminat invocat quan un fil acaba bruscament a causa d'una excepció no detectada. |
36) | buit estàtic | setDefaultUncaughtExceptionHandler() | Estableix el controlador predeterminat que s'invoca quan un fil finalitza bruscament a causa d'una excepció no detectada. |
- Com realitzar dues tasques per dos fils?
- Com realitzar multithreading per classe anònima?
- Què és el programador de fils i quina diferència hi ha entre la programació preventiva i el tall de temps?
- Què passa si iniciem un fil dues vegades?
- Què passa si cridem al mètode run() en lloc del mètode start()?
- Quin és l'objectiu del mètode d'unió?
- Per què JVM finalitza el fil del dimoni si no queden fils d'usuari?
- Què és el ganxo d'apagada?
- Què és la recollida d'escombraries?
- Quin és l'objectiu del mètode finalize()?
- Què fa el mètode gc()?
- Què és la sincronització i per què utilitzar la sincronització?
- Quina diferència hi ha entre el mètode sincronitzat i el bloc sincronitzat?
- Quines són les dues maneres de realitzar la sincronització estàtica?
- Què és el bloqueig i quan es pot produir?
- Què és la comunicació entre fils o la cooperació?
- Multithreading
- Cicle de vida d'un fil
- Dues maneres de crear un fil
- Com realitzar diverses tasques mitjançant diversos fils
- Programador de fils
- Dormir un fil
- Podem iniciar un fil dues vegades?
- Què passa si cridem al mètode run() en lloc del mètode start()?
- Unir-se a un fil
- Posar nom a un fil
- Prioritat d'un fil
- Fil del dimoni
- ApagatHook
- Recollida d'escombraries
- Sincronització amb mètode sincronitzat
- Bloc sincronitzat
- Sincronització estàtica
- Bloqueig
- Comunicació entre fils