Java Tutorial – Crearea și controlul firului

Înainte de a intra în adâncimi în firele de execuție, se propune o referință rapidă a clasei de fir.

Thread Subiect de clasă

este clasa care încapsulează tot controlul necesar asupra firelor de execuție (fire). Trebuie să distingeți clar un obiect de fir al unui fir de execuție sau al unui fir. Această distincție este complicată, deși poate fi simplificată dacă este considerată obiectul firului ca panoul de control al unui fir de execuție (fir). Clasa firului este singura modalitate de a controla comportamentul firelor și, în acest scop, este servit ca metode care sunt expuse în secțiunile următoare.

Metode de clasă

Acestea sunt Metode statice care ar trebui să fie numite direct în clasa firului.

CITYTHRED ()

Această metodă returnează obiectul firului care reprezintă firul de execuție care se execută în prezent.

Randament ()

Această metodă determină ca interpretul să schimbe contextul dintre firele curente și următorul fir executabil disponibil. Este o modalitate de a vă asigura că ne gândim la prioritate mai mici nu suferă de foamete.

somn (lung)

Metoda Sleep () determină interpretul să pună firul în desfășurare să doarmă în timpul numărului de milisecunde care sunt indicate în parametrul invocării. Odată ce aceste milisecunde au trecut, firul menționat va fi disponibil din nou pentru execuție. Ceasurile asociate cu majoritatea interpreților Java nu vor putea obține o precizie mai mare de 10 milisecunde, atâta timp cât este permisă indicarea până la nanosecunde în apelul alternativ la această metodă.

Metode de instanță

Toate metodele din clasa filetului nu sunt colectate aici, ci doar cele mai interesante, deoarece celelalte corespund zonelor în care standardul Java nu este completă și poate rămâne depășită în următoarea versiune de la JDK, prin urmare, dacă aveți Doriți să completați informațiile care sunt prezentate aici, se utilizează documentația de programare a aplicației JDK (API).

Start ()

Această metodă indică interpretul Java care creează un context al firului sistemului și începeți să o executați. Apoi, metoda Run () din acest fir va fi invocată în noul context al firului. Trebuie să aveți grijă să nu sunați la metoda de start () de mai multe ori pe un anumit fir.

rulați ()

Metoda Run () constituie corpul unui fir în execuţie. Aceasta este singura metodă de interfață runnabilă. Se numește prin metoda de start () după inițializarea firului corespunzător al sistemului. Ori de câte ori metoda Run () returnează controlul, firul curent se va opri.

Stop ()

Această metodă determină oprirea firului. Este adesea o modalitate bruscă de a opri un fir, mai ales dacă această metodă este executată pe firul în curs de desfășurare. În acest caz, linia imediat după apelul la metoda stop () nu este niciodată executată, deoarece contextul firului moare înainte de oprire () returnează controlul. Un mod mai elegant de a opri un fir este de a utiliza o anumită variabilă care determină metoda de execuție () să se termine în mod ordonat. De fapt, nu ar trebui să recurgeți niciodată la utilizarea acestei metode.

Suspend ()

Metoda suspendare () este alta decât oprirea (). Suspendați () Luați firul și determină oprirea executării fără a distruge sistemul subiacent, nici starea firului care rulează anterior. Dacă execuția unui fir este suspendată, acesta poate fi numit un rezumat () pe același fir pentru a realiza din nou acest lucru.

reluare ()

Metoda rezumă ( ) Este folosit pentru a revigora un fir suspendat. Nu există garanții că firul începe să execute imediat, deoarece poate exista un fir de prioritate în prezent, dar se reia () determină ca firul să fie un candidat care să fie executat din nou.

SetPriority (Int)

Metoda SetPrioritate () atribuie prioritatea indicată de valoarea ultima ca parametru. Există destul de puține constante predefinite pentru prioritate, definite în clasa firului, cum ar fi Min_Prioritate, Norm_Priority și Max_Prioritate, care iau valorile 1, 5 și, respectiv, 10. Ca un ghid aproximativ de utilizare, se poate stabili că majoritatea proceselor la nivel de utilizator ar trebui să ia o prioritate în jurul Norm_Priorității. Sarcinile de fundal, cum ar fi o intrare / ieșire în rețea sau noul desen al ecranului, ar trebui să aibă o prioritate apropiată de Min_Prioritate. Cu sarcinile la care se stabilește cea mai mare prioritate, în jurul Max_Priority, trebuie să fiți deosebit de atenți, deoarece dacă nu se efectuează apeluri () sau să producă (), poate determina sub controlul interpretului Java.

GetPriority ()

Această metodă returnează prioritatea firului de execuție în desfășurare, care este o valoare între una și zece.

SetName (șir)

Această metodă permite identificarea firului cu un nume menmonic. În acest fel, se facilitează purificarea programelor multi-familiale. Numele mnemonic va apărea pe toate liniile de aspect care sunt afișate de fiecare dată când interpretul Java imprimă deconectați excepții.

getname ()

Această metodă returnează valoarea curentă, tip lanț, alocat Ca un nume de filet de execuție utilizând SetName ().

Crearea unui fir

Există două moduri de a obține fire de execuție (fire) în Java. Unul implementează interfața runnabilă, cealaltă este de a extinde clasa firului.

Implementarea interfeței runnabile este modul obișnuit de a crea fire. Interfețele oferă programatorului o modalitate de a grupa lucrarea de infrastructură a unei clase. Acestea sunt utilizate pentru a proiecta cerințele comune ale setului de clase care trebuie implementate. Interfața definește munca și clasele sau clasele, care implementează interfața pentru a efectua acea lucrare. Diferitele grupuri de clase care implementează interfața vor trebui să urmeze aceleași reguli de funcționare.

Există câteva diferențe între interfață și clasă, care sunt deja cunoscute și aici sunt doar rezumate. În primul rând, o interfață poate conține doar metode abstracte și / sau variabile statice și finale (constante). Clasele, pe de altă parte, pot implementa metode și pot conține variabile care nu sunt constante. În al doilea rând, o interfață nu poate implementa nicio metodă. O clasă care a implementat o interfață trebuie să implementeze toate metodele definite în acea interfață. O interfață are posibilitatea de a putea răspândi din alte interfețe și, spre deosebire de clase, poate fi extinsă din mai multe interfețe. În plus, o interfață nu poate fi instanțiată cu noul operator; De exemplu, următoarea instrucțiune nu este permisă:

Runnable a = new Runnable(); // No se permite

Prima metodă de creare a unui fir de execuție este pur și simplu pentru a extinde clasa firului:

class MiThread extends Thread { public void run() { . . . }
public class MiThread implements Runnable { Thread t; public void run() { // Ejecución del thread una vez creado } }

În acest caz, trebuie să creăm o instanță de fire înainte ca sistemul să poată executa procesul ca fir . În plus, metoda Rezumat () este definită în interfața runnabilă și trebuie implementată. Singura diferență dintre cele două metode este că acesta din urmă este mult mai flexibil. În exemplul anterior, există încă posibilitatea de a extinde clasa Mithread, dacă este necesar. Cele mai create clase care trebuie să ruleze ca un fir vor implementa interfața runnabilă, deoarece probabil vor extinde oricare dintre funcționalitățile lor la alte clase.

Nu credeți că interfața runnabilă face ceva când sarcina progresul. Conține doar metode abstracte, cu care este o clasă pentru a da o idee despre designul clasei firului. De fapt, dacă sunt observate sursele Java, se poate verifica doar o metodă abstractă:

package java.lang;public interface Runnable { public abstract void run() ; }

și aceasta este tot ce există pe interfață Runnable. După cum se vede, o interfață oferă doar un design pentru clase care vor fi implementate. În cazul executării, forței la definiția metodei Run (), prin urmare, cea mai mare parte a lucrării se face în clasa firului. O privire puțin mai profundă definiția clasei de fir dă idee Ce se întâmplă cu adevărat:

iv id = „23Aed0c75b”

al acestui cod de cod este clar că și clasa firului Implementați interfața runnabilă. Sarcină. Când se întâmplă acest lucru, metoda Run () din clasă va determina să ruleze ca fir.

Este prezentat un exemplu, Java1001.java, care implementează interfața runnabilă pentru a crea un program multi-telefon.

class java1001 { static public void main( String args ) { // Se instancian dos nuevos objetos Thread Thread hiloA = new Thread( new MiHilo(),"hiloA" ); Thread hiloB = new Thread( new MiHilo(),"hiloB" ); // Se arrancan los dos hilos, para que comiencen su ejecución hiloA.start(); hiloB.start(); // Aquí se retrasa la ejecución un segundo y se captura la // posible excepción que genera el método, aunque no se hace // nada en el caso de que se produzca try { Thread.currentThread().sleep( 1000 ); }catch( InterruptedException e ){} // Presenta información acerca del Thread o hilo principal // del programa System.out.println( Thread.currentThread() ); // Se detiene la ejecución de los dos hilos hiloA.stop(); hiloB.stop(); } }class NoHaceNada {// Esta clase existe solamente para que sea heredada por la clase// MiHilo, para evitar que esta clase sea capaz de heredar la clase// Thread, y se pueda implementar el interfaz Runnable en su// lugar}class MiHilo extends NoHaceNada implements Runnable { public void run() { // Presenta en pantalla información sobre este hilo en particular System.out.println( Thread.currentThread() ); } }

După cum puteți vedea, programul definește o clasă Mihilo care se extinde la clasa neechitizată și implementează interfața runnabilă. Metoda Run () este redefinită în clasa Mihil pentru a prezenta informații despre fir.

Singurul motiv pentru extinderea clasei de neegalat este de a oferi un exemplu de situație în care o altă clasă trebuie extinsă , în plus față de implementarea interfeței.

în exemplul Java1002.Java prezintă același program în principiu, dar în acest caz, extinderea clasei de fir, în loc să implementeze interfața runnabilă pentru a crea programul multi-telefon.

DIV id = „FCC07783FC”

in Acest caz, noua clasă Mihil extinde clasa firului și nu implementează direct interfața runnabilă (clasa filetului implementează interfața runnabilă, astfel încât Mihilo indirect implementează, de asemenea, acea interfață). Restul programului este similar cu cel precedent.

și puteți prezenta încă un exemplu mai simplu, folosind un producător al clasei de fir care nu are nevoie de parametri, așa cum este prezentat în exemplul Java1003.java. În exemplele de mai sus, constructorul a folosit pentru firul necesar doi parametri, primul obiect de orice fel care implementează interfața de rulare și al doilea șir de un șir indicat de numele firului (acest nume este independent de numele variabilei la Obiectul firului).

DIV ID = „30890FFE47”>

Sudgenți În acest exemplu, obiectele de fire de instanțiere, sunt mult mai puțin complexe, fiind programul, în esență, același exemple Anterior.

Pornirea unui fir

Aplicații Run Main () după pornire. Acesta este motivul principal () este locul natural pentru a crea și a începe alte fire. Linia de cod:

 t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) );

Creați un nou fir de execuție. Cele două argumente anterioare reprezintă numele firului și timpul dorit să așteptați înainte de a imprima mesajul.

Când aveți control direct asupra firelor, trebuie să le porniți în mod explicit. În exemplul cu:

 t1.start();

Start (), este de fapt o metodă ascunsă în firul de execuție care apelează ().

Manipularea unui fir

Dacă totul a mers bine în crearea firului, T1 trebuie să conțină un fir valid, pe care îl vom controla în metoda Run ().

Odată înăuntru Rulați (), declarațiile de execuție pot fi pornite ca în alte programe. Rulați () servește ca un principal de rutină () pentru fire; Când rulează () se termină, el face și firul. Tot ceea ce doriți să faceți firul de execuție trebuie să fie în interior Run (), așa că atunci când se spune că o metodă funcționează, este obligatoriu să scrieți o metodă Run ().

În acest exemplu, încercăm Pentru a aștepta imediat pentru o perioadă aleatorie de timp (trecut prin constructor):

sleep( retardo );

Sleep () Pur și simplu indică somnul firului de execuție în timpul milisecunde specificate . Somnul () trebuie utilizat atunci când este destinat să întârzie executarea firului. Somn () nu consumă resurse de sistem în timp ce firul doarme. În acest fel, alte fire pot continua să funcționeze. Odată ce întârzierea a fost făcută, mesajul este imprimat „Bună ziua!” Cu numele firului și întârzierea.

suspensia unui fir

poate fi utilă pentru suspendarea executării unui fir fără a marca o limită de timp. Dacă, de exemplu, construiește un applet cu un fir de animație, cu siguranță veți dori să permiteți utilizatorului opțiunea de a opri animația până când vreau să continuu. Nu este vorba despre finalizarea animației, dar dezactivarea acestuia. Pentru acest tip de control al firului de execuție puteți utiliza metoda Suspend ().

 t1.suspend();

Această metodă nu oprește definitiv execuția. Firul este suspendat pe termen nelimitat și de ao reactiva din nou, este necesar să fie invocată la metoda sumară ():

 t1.resume();

Opriți un fir

ultimul element de control care este necesar pe firele de execuție este metoda Stop (). Este folosit pentru a termina agățarea unui fir:

 t1.stop();

Acest apel nu distruge firul, dar oprește execuția sa. Execuția nu poate fi reluată cu t1.start (). Atunci când variabilele care sunt utilizate în fir sunt nerespectate, obiectul firului (creat cu nou) va fi marcat pentru ao elimina și colectorul de gunoi va fi responsabil pentru eliberarea memoriei pe care le-a folosit.

în exemplu , Nu știu că trebuie să opriți în mod explicit firul de execuție. Pur și simplu vă permite să terminați. Cele mai complexe programe vor avea nevoie de control asupra fiecărei fire de lanț, metoda Stop () poate fi utilizată în acele situații.

Dacă este necesar, poate fi verificată dacă un fir este viu sau nu; Având în vedere viu un fir care a început și nu a fost arestat.

DIV ID = „6BB3437A10”>

Această metodă va reveni în cazul în care firul T1 este în viață, adică deja A fost numită metoda sa () și nu sa oprit cu o metodă de oprire () sau a terminat () în execuția sa.

În exemplu, nu există probleme de a face o oprire necondiționată, când toate firele vii sunt. Dar, dacă la un fir de execuție, este posibil să nu fiți în viață, metoda STOP () este invocată, va fi generată o excepție.În acest caz, în care starea firului nu poate fi cunoscută în prealabil este locul în care este necesară utilizarea metodei isalive ().

Leave a Comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *