Академический Документы
Профессиональный Документы
Культура Документы
Thread[Thread-1.10.main]:5 Thread[Thread-4.1.main]:4
Thread[Thread-1.10.main]:4 Thread[Thread-5.1.main]:4
Thread[Thread-1.10.main]:3 Thread[Thread-6.1.main]:4
Thread[Thread-1.10.main]:2 Thread[Thread-3.1.main]:3
Thread[Thread-1.10.main]:1 Thread[Thread-4.1.main]:3
Thread[Thread-2.1.main]:5 Thread[Thread-5.1.main]:3
Thread[Thread-2.1.main]:4 Thread[Thread-6.1.main]:3
Thread[Thread-2.1.main]:3 Thread[Thread-3.1.main]:2
Thread[Thread-2.1.main]:2 Thread[Thread-4.1.main]:2
Thread[Thread-2.1.main]:1 Thread[Thread-5.1.main]:2
Thread[Thread-3.1.main]:5 Thread[Thread-6.1.main]:2
Thread[Thread-4.1.main]:5 Thread[Thread-4.1.main]:1
Thread[Thread-5.1.main]:5 Thread[Thread-3.1.main]:1
Thread[Thread-6.1.main]:5 Thread[Thread-6.1.main]:1
Thread[Thread-3.1.main]:4 Thread[Thread-5.1.main]:1
Группы потоков
java.lang.ThreadGroup[name=x,maxpri=10]
Thread[one,5,x]
java.lang.ThreadGroup[name=y,maxpri=10]
java.lang.ThreadGroup[name=z,maxpri=10]
Thread[two,5,z]
one f()
two f() java.lang.ThreadGroup[name=x,maxpri=10]
Thread[one,1,x]
java.lang.ThreadGroup[name=y,maxpri=10]
java.lang.ThreadGroup[name=z,maxpri=10]
Thread[two,1,z]
Управление группами процессов
• (1)ThreadGroup[name=system,maxpri=10]
• Thread[main,5,system]
• (2) ThreadGroup[name=system,maxpri=9]
• Thread[main,6,system]
• (1) Numele grupului de bază este system,
numele procesului principal este main și
aparține grupului system
• (2) Implicit prioritatea grupului este 10 și
micșorăm la 9. Implicit prioritatea thread-ului
este 5 și mărim la 6.
continuare
ThreadGroup g1 = new ThreadGroup("g1");
g1.setMaxPriority(Thread.MAX_PRIORITY);
t.setPriority(Thread.MAX_PRIORITY);
g1.list();
// (3)
Rezultatul realizării
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
g1.setMaxPriority(Thread.MAX_PRIORITY - 2);
g1.setMaxPriority(Thread.MAX_PRIORITY);
g1.list();
// (4)
Rezultatul realizării
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
(5) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
Thread[B,8,g1]
Implicit prioritatea thread-ului creat este 6 ca
proiritatea procesului de sistemă. Dar la
modificare nu pote fi mai mare ca prioritatea
grupului căruia îi aparține.
continuare
g1.setMaxPriority(Thread.MIN_PRIORITY + 2);
t = new Thread(g1, "C");
g1.list();
// (6)
Rezultatul realizării
(6) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,6,g1]
Dacă prioritatea grupului este mai mică ca
prioritatea procesului de sistemă, atunci
prioritatea thread-ului creat în grupul g1 va
primi prioritatea mai mare ca prioritatea
grupului egală cu prioritatea procesului de
sistemă.
continuare
// (6)
t.setPriority(t.getPriority() -1);
g1.list();
Rezultatul realizării
ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
Результат программы будет
(1) ThreadGroup[name=system,maxpri=10]
Thread[main,5,system]
(2) ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
(5) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
Thread[B,8,g1]
(6) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,6,g1]
(7) ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
(8) ThreadGroup[name=g2,maxpri=3]
(9) ThreadGroup[name=g2,maxpri=3]
(10)ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
ThreadGroup[name=g1,maxpri=3]
Thread[A,9,g1]
Thread[B,8,g1]
Thread[C,3,g1]
ThreadGroup[name=g2,maxpri=3]
Thread[0,6,g2]
Thread[1,6,g2]
Thread[2,6,g2]
Thread[3,6,g2]
Thread[4,6,g2]
Clasa Thread
Sincronizarea thread-urilor cu yield()
public class SimpleThread1 extends Thread
{
private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;
public SimpleThread1()
{
System.out.println("Making " + threadNumber); }
public void run()
{
while(true)
{ System.out.println("Thread " + threadNumber + "(" + countDown + ")");
if(--countDown == 0) return;
yield();
}}
public static void main(String[] args)
{
for(int i = 0; i < 5; i++)
new SimpleThread1().start();
System.out.println("All Threads Started");
}}
Sincronizarea thread-urilor cu sleep()
public class SimpleThread extends Thread
{
private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;
public SimpleThread()
{
System.out.println("Making " + threadNumber); }
public void run()
{
while(true)
{ System.out.println("Thread " + threadNumber + "(" + countDown + ")");
if(--countDown == 0) return;
try{ sleep(100);}
Catch (InterruptedException e)
{
Throw new RuntimeException(e);}
}}
public static void main(String[] args)
{
for(int i = 0; i < 5; i++)
new SimpleThread().start();
System.out.println("All Threads Started");
Metodele clasei Thread
Constructorii
Crearea unui nou obiect Thread
public Thread();
Crearea unui nou obiect Thread cu indicarea obiectului pentru care
va fi activată metoda run().
public Thread(Runnable target);
Analogic constructorului precedent, dar se indică ți numele
obiectului Thread
public Thread(Runnable target, String name);
Crearea unui nou obiect Thread și se indică numele lui.
public Thread(String name);
Crearea unui nou obiect Thread, se indică numele grupului căruia îi
aparâine și obiectul pentru cae va fi activată metoda run().
public Thread(ThreadGroup group, Runnable target);
Analogic constructorului precedent, dar se indică ți numele
obiectului Thread
public Thread(ThreadGroup group, Runnable target, String
name); Crearea unui nou obiect Thread cu indicarea numelui
grupului căruia îi aparâine și numele lui.
public Thread(ThreadGroup group, String name);
Metodele
activeCount apreciază numărul de thread-uri active din grupul
căruia îi aparâine
public static int activeCount();
• class MyData {
• private int Data;
• private boolean Ready;
• private boolean Taken;
• public MyData() {
• Ready=false;
• Taken=true; }
• public void store(int Data) {
• while (!Taken);
• synchronized (this) {
• this.Data=Data;
• Taken=false;
• Ready=true;
• }
• }
continuare
• class MyData {
• private int Data;
• private boolean Ready;
• public MyData() {
• Ready=false;
• }
• public synchronized void store(int Data) {
• while (Ready)
• try {
• wait();
• } catch (InterruptedException e) { }
• this.Data=Data;
• Ready=true;
• notify();
• }
continuare
• import java.util.*;
• class Barrier { // Clasa Barrier sincronizeaza toti
• //participantii private
• int ParticipatingThreads;
• private int WaitingAtBarrier;
• public Barrier(int num){ //Constructorul
obiectului
• ParticipatingThreads = num;
• WaitingAtBarrier=0;
• }
continuare
JavaServer Pages (JSP) este o tehnologie care ajută la crearea paginilor generate
dinamic prin conversia fișierelor de script în module Java executabile.
HTTP request către web server.
.jsp în loc de .html or .htm.
Serverul web server este un server Java
identifică și tratează Java servlets.
serverul Web recunoaște cererea HTTP către pagina JSP -> fwd to JSP
engine.
JSP Engine încarcă pagina JSP și o convertește la Java servlet.
JSP Engine compilează servletul într-o clasă Java executabilă -> forwards to
Servlet Engine.
detecție și recompilare la modificarea fișierelor JSP
Servlet Engine încarcă clasa servletului și o execută. La executie, servletul
generează output in format HTML
Servlet Engine transmite outputul HTML către Web Server într-un HTTP
Response.
Web Server ->
Clasa Servlet
Un container de servleti transformã cererea HTTP de la client într-un obiect
de tip HTTPServletRequest , transmis la un servlet (sau pagina JSP) care
genereazã un obiect de tip HTTPServletResponse sau transmite cererea unei
alte componente Web. Containerul de servleti transforma acest obiect într-un
raspuns HTTP, transmis la client.
Mai multi servleti dintr-o aplicatie pot folosi date (atribute) din patru
obiecte comune, numite “Scope Objects”:
Web Context : accesibil tuturor componentelor dintr-un context
(aplicatie)
Session: accesibil componentelor dintr-o sesiune client
Request: accesibil componentelor care trateazã o cerere
Page: accesibil paginii JSP care a creat obiectul
Intr-o schemã simplã MVC un servlet are rolul de “controller”. De
fapt aplicatiile reale contin mai multi servleti, fiecare “serveste” o
paginã diferitã din aplicatie. Cererile de la clienti sunt primite de un
servlet cu rol de dispecer, care selecteazã un alt servlet din aplicatie
în functie de parametrii cererii HTTP.
Programare in retea
10/24/2019 Curs 13 1
Programare in retea
1.1 Folosirea URL-urilor
– URL (Uniform Resource Locator) reprezinta o referinta
(adresa) a unei resurse de pe Internet
– Structura unui URL: hostname, numele fisierului,
numarul portului (optional) si numele resursei (optional)
http://java.sun.com
Protocol Numele resursei
Rezultat:
protocol = http
host = java.sun.com
filename = /docs/books/tutorial/index.html
port = 80
ref = DOWNLOADING
Programare in retea
1.2 Connectarea la o resursa web
– Accesarea unei resurse se face prin intermediul obiectului URL
– Metoda openStream intoarce un obiect java.io.InputStream care se
poate accesa ca orice alt flux de intrare
import java.net.*;
import java.io.*;
try {
URL osu = new URL("http://www.upm.ro/");
URLConnection osuConnection = osu.openConnection();
} catch (MalformedURLException e) { // new URL() failed
. . .
} catch (IOException e) {
. . .
}
Programare in retea
1.4 Programarea serverului
– Pasi necesari:
1. Se creaza un obiect de tip ServerSocket:
ServerSocket server=new ServerSocket(port,queueLength);
class Server {
public static void main(String args[]) {
String data = "Mesaj!";
try {
ServerSocket server_socket = new ServerSocket(1234);
System.out.println("Pornesc...");
System.out.print("Sunt functional!\n");
PrintWriter outToClient = new
PrintWriter(socket.getOutputStream(), true);
outToClient.close();
socket.close();
server_socket.close();
}
catch(Exception e) {
System.out.print("Oops! Nu a functionat!\n");
}
}
}
Programare in retea
1.6 Aplicatie client-server
import java.lang.*;
import java.io.*;
import java.net.*;
class Client {
public static void main(String args[]) {
try {
Socket socket = new Socket("localhost", 1234);
System.out.println(inFromServer.readLine());
inFromServer.close();
}
catch(Exception e) {
System.out.print(" Oops! Nu a functionat!\n");
}
}
}
Programare in retea
1.7 Datagrame
– Protocolul UDP furnizeaza o alta metoda de comunicare
in retea, prin intermediul datagramelor.
– In acest model clientul trimite un pachet cu cererea
catre server, acesta primeste pachetul si returneaza
raspunsul tot prin intermediul unui pachet.
– Clasa DatagramSockets se foloseste pentru realizarea
conexiunii
Programare in retea
1.7 Datagrame
import java.net.*;
import java.io.*;
public class DatagramServer {
public static final int PORT = 8200;
private DatagramSocket socket = null;
DatagramPacket cerere, raspuns = null;
public DatagramServer() throws IOException {
Socket = new DatagramSocket(PORT);
try {
while (true) {
//Declara pachetul in care va fi receptionata cererea
byte[] buf = new byte[256];
cerere = new DatagramPacket(buf, buf.length);
//Astepta aparitia unui pachet cu cererea
socket.receive(cerere);
//Afla adresa si portul de la care vine cererea
InetAddress adresa = cerere.getAddress();
int port = cerere.getPort();
Programare in retea
1.7 Datagrame
//Construieste raspunsul
buf = ("Hello " + new String(cerere.getData())).getBytes();
//Trimite un pachet cu raspunsul catre client
raspuns = new DatagramPacket(buf, buf.length, adresa, port);
socket.send(raspuns);
}
} finally {
socket.close();
}
}
//Afiseaza raspunsul
System.out.println(new String(packet.getData()));
} finally {
socket.close();
}
}
}
Gruparea firelor de execuție pune la dispoziție
un mecanism pentru manipularea acestora ca un
obiect, și nu individual.
Gruparea firelor de execuție se realizează prin
intermediul clasei ThreadGroup.
Fiecare fir de execuție Java este membru al unui
grup, indiferent dacă specificăm explicit sau nu acest
lucru.
La pornirea unui program Java se creează
automat un obiect de tip ThreadGroup cu numele
main, care va reprezenta grupul tuturor firelor de
execuție create direct din program și care nu au fost
atașate explicit altui grup.
Afilierea unui fir la un anumit grup se
realizează la crearea sa și devine permanentă, nu se
poate muta un fir dintr-un grup în altul, după ce
acesta a fost creat.
Dacă se crează un fir și nu se specifică din ce
grup face parte, el va fi plasat automat în același grup
cu firul de execuțe care l-a creat.
Putem să ignorăm complet plasarea firelor de
execuție în grupuri . Atunci sistemul le va aduna pe
toate în grupul main.
Există situații când gruparea firelor de execuție
poate ușura substanțial manevrarea lor. Putem să
pornim sau să suspendăm toate firele dintr-un grup
cu un singur apel de metodă.
Crearea unui fir de execuție și plasarea lui într-un
grup specificat se realizează prin următorii
constructori ai clasei Thread:
public Thread(ThreadGroup group, Runnable target)
public Thread(ThreadGroup group, String name)
public Thread(ThreadGroup group, Runnable target,
String name)
Fiecare din acești costructori creează un fir de
execuție, îl inițializează și îl plasează într-un grup
specificat ca argument.
Pentru a afla cărui grup aparține un anumit fir de
execuție putem folosi metoda getThreadGroup() a
clasei Thread.
Un grup poate avea ca părinte un alt grup, ceea
ce înseamnă că firele de execuție pot fi plasate într-o
ierarhie de grupuri, în care rădăcina este grupul
implicit main.
Pentru a crea un grup se folosește cintacsa:
ThreadGroup grup1 = new ThreadGroup(„Nume1");
Pentru a crea un grup inclus în alt grup folosim
cintacsa:
ThreadGroup grup2 = new ThreadGroup(grup1,
„Nume2");
Nu toate metodele clasei Thread pot fi utilidate
asupra firelor de execuție din grup.
public class TestAccess
{ public static void main(String[] args)
{ ThreadGroup
x = new ThreadGroup("x"),
y = new ThreadGroup(x, "y"),
z = new ThreadGroup(y, "z");
Thread
one = new TestThread1(x, "one"),
two = new TestThread2(z, "two");
}}
class TestThread1 extends Thread
{ private int i;
TestThread1(ThreadGroup g, String name)
{ super(g, name); }
void f()
{ i++;
System.out.println(getName() + " f()"); }}
class TestThread2 extends TestThread1
{ TestThread2(ThreadGroup g, String name)
{ super(g, name);
start(); }
public void run()
{ ThreadGroup g =
getThreadGroup().getParent().getParent();
g.list();
Thread[] gAll = new Thread[g.activeCount()];
g.enumerate(gAll);
for(int i = 0; i < gAll.length; i++)
{ gAll[i].setPriority(Thread.MIN_PRIORITY);
((TestThread1)gAll[i]).f(); }
g.list(); }}
java.lang.ThreadGroup[name=x,maxpri=10]
Thread[one,5,x]
java.lang.ThreadGroup[name=y,maxpri=10]
java.lang.ThreadGroup[name=z,maxpri=10]
Thread[two,5,z]
one f()
two f() java.lang.ThreadGroup[name=x,maxpri=10]
Thread[one,1,x]
java.lang.ThreadGroup[name=y,maxpri=10]
java.lang.ThreadGroup[name=z,maxpri=10]
Thread[two,1,z]
Fiecare fir de executie Java primește la crearea sa o
anumită prioritate. O prioritate este de fapt un numar
întreg cu valori cuprinse între 1 și 10. Implicit prioritatea
unui fir de execuție nou creat are valoarea 5. Pot fi
utilizate trei constante care sunt definite în clasa Thread:
public static final int MIN_PRIORITY –
prioritatea minimă 1
public static final int NORM_PRIORITY –
prioritatea implicită 5
public static final int MAX_PRIORITY –
prioritatea maximă 10
Schimbarea ulterioară a prioritații unui fir de
execuție se realizează cu metoda setPriority() a clasei
Thread.
Grupul cu fire de execuție implicit la creare
primește prioritatea 10. Dar poate fi modificată de
la 1 pînă la 10.
Proipitatea grupului poate fi modificată cu
metoda setMaxPriority() a clasei ThreadGroup.
La modificarea priorității grupului sau a firului
de execuție există unele restricții.
public class SPriority extends Thread
{private int countD=5;
private volatile double d=0;
public SPriority(int priority)
{setPriority(priority);
start();}
public String toString
{return super.toString() + “:” + countD;}
public void run()
{while(true)
for(int i=0; i<100000; i++)
d=d+(Math.PI+Math.E)/(double)i;
System.out.println(this)
If(--countD==0) return;}}
public static void main(String[]args)
{new SPriority(Thread.MAX_PRIORITY);
for(int i=0; i<5; i++)
new SPriority (Thread.MIN_PRIORITY);}}
Thread[Thread-1.10.main]:5 Thread[Thread-4.1.main]:4
Thread[Thread-1.10.main]:4 Thread[Thread-5.1.main]:4
Thread[Thread-1.10.main]:3 Thread[Thread-6.1.main]:4
Thread[Thread-1.10.main]:2 Thread[Thread-3.1.main]:3
Thread[Thread-1.10.main]:1 Thread[Thread-4.1.main]:3
Thread[Thread-2.1.main]:5 Thread[Thread-5.1.main]:3
Thread[Thread-2.1.main]:4 Thread[Thread-6.1.main]:3
Thread[Thread-2.1.main]:3 Thread[Thread-3.1.main]:2
Thread[Thread-2.1.main]:2 Thread[Thread-4.1.main]:2
Thread[Thread-2.1.main]:1 Thread[Thread-5.1.main]:2
Thread[Thread-3.1.main]:5 Thread[Thread-6.1.main]:2
Thread[Thread-4.1.main]:5 Thread[Thread-4.1.main]:1
Thread[Thread-5.1.main]:5 Thread[Thread-3.1.main]:1
Thread[Thread-6.1.main]:5 Thread[Thread-6.1.main]:1
Thread[Thread-3.1.main]:4 Thread[Thread-5.1.main]:1
public class ThreadGroup1
{ public static void main(String[] args)
{ ThreadGroup sys =
Thread.currentThread().getThreadGroup();
sys.list();
// (1)
sys.setMaxPriority(Thread.MAX_PRIORITY - 1);
Thread curr = Thread.currentThread();
curr.setPriority(curr.getPriority() + 1);
sys.list();
(1)ThreadGroup[name=system,maxpri=10]
Thread[main,5,system]
(2) ThreadGroup[name=system,maxpri=9]
Thread[main,6,system]
(1) Numele grupului de bază este system,
numele procesului principal este main și
aparține grupului system
(2) Implicit prioritatea grupului este 10 și
micșorăm la 9. Implicit prioritatea thread-ului
este 5 și mărim la 6.
ThreadGroup g1 = new ThreadGroup("g1");
g1.setMaxPriority(Thread.MAX_PRIORITY);
t.setPriority(Thread.MAX_PRIORITY);
g1.list();
// (3)
(3) ThreadGroup[name=g1,maxpri=9]
Thread[A,9,g1]
g1.setMaxPriority(Thread.MAX_PRIORITY);
g1.list();
// (4)
(4) ThreadGroup[name=g1,maxpri=8]
Thread[A,9,g1]
1. Starea ”NewThread”
Obiectul fir de execuție a fost creat dar înca nu a fost
startat.
Thread fir=new Thread(obiectActiv);
//fir se gaseste in starea "New Thread„
Nu are alocate resurse
Putem apela start
2. Runnable – Firul se afla in starea in care poate fi
rulat in momentul in care procesorul devine
disponibil.
Fir.start();
// firul de execuție devine activ
Alocare resurse
Planificare la procesor
Apel run()
3. Blocked sau not-runnable – Firul de execuție
este blocat si nu poate fi rulat, chiar daca
procesorul este disponibil.
Este ”adormit de metoda sleep()
Activăm metoda wate() așteptînd realizarea unei
condișii
Este blocat într-o operație de I/O
4. Dead – Calea normala prin care un fir se termina
este prin ieșirea din metoda run(). Se poate forța
terminarea firului apelând metoda stop()
dar nu se recomanda folosirea sa, fiind o metoda
“depreciată” in Java2.
- Preemptiv
- Cooperativ
Sistem preemptiv
1. Clasa Thread
O modalitate de a crea şi lansa in execuţie
fire (de execuţie ) este de a folosi clasa
Thread din pachetul java.lang:
Public class Thread1extends Thread
Pentru a crea un fir de execuţie , trebuie
să cream un obiect de tipul Thread:
Thread fir=new Thread();
2. Interfața Runnable constituie o
alternativă la extinderea clasei Thread.
Avantajul constă in primul rând în însusi
faptul că este o interfaţă: o clasă oarecare
poate implementa Runnable şi extinde o
altă clasă (pe când o clasă ce extind
Thread nu mai poate extinde vreo altă
clasă).
public class Thread11 extends Objects11
implements Runnable
Crearea thread-urilor utilizînd clasa Thread
public class SimpleThread extends Thread {
private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;
public SimpleThread() {
System.out.println("Making " + threadNumber); }
public void run() {
while(true)
{ System.out.println("Thread " + threadNumber + "(" +
countDown + ")");
if(--countDown == 0) return;
}}
public static void main(String[] args) {
for(int i = 0; i < 5; i++)
new SimpleThread().start();
System.out.println("All Threads Started");
}}
Rezultatul realizării:
Making 1 Thread 5(4)
Making 2 Thread 1(3)
Thread 1(5) Thread 4(3)
Making 3 Thread 2(3)
Thread 2(5) Thread 3(3)
Making 4 Thread 5(3)
Making 5 Thread 1(2)
Thread 4(5) Thread 4(2)
All Threads Started Thread 2(2)
Thread 3(5) Thread 3(2)
Thread 5(5) Thread 5(2)
Thread 1(4) Thread 1(1)
Thread 2(4) Thread 4(1)
Thread 4(4) Thread 2(1)
Thread 3(4) Thread 5(1)
Thread 3(1)
Utilizarea interfeții Runnable
public class ThreadRun impliments Runnable
{ privat int count =5;
public String toString(){
return “#”+Thread.currentThread().getName()+count;
}
public void run(){
while (true) {
System.out.primtln(this);
if (--count==0) return;
}}
public static void main(String[ ]args)
{for(int i=0; i<5; i++)
New Thread(new ThreadRun()).start();
}}
Clasa Thread
Sincronizarea thread-urilor cu yield()
public class SimpleThread1 extends Thread
{
private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;
public SimpleThread1()
{
System.out.println("Making " + threadNumber); }
public void run()
{
while(true)
{ System.out.println("Thread " + threadNumber + "(" + countDown + ")");
if(--countDown == 0) return;
yield();
}}
public static void main(String[] args)
{
for(int i = 0; i < 5; i++)
new SimpleThread1().start();
System.out.println("All Threads Started");
}}
Sincronizarea thread-urilor cu sleep()
public class SimpleThread extends Thread
{
private int countDown = 5;
private static int threadCount = 0;
private int threadNumber = ++threadCount;
public SimpleThread()
{
System.out.println("Making " + threadNumber); }
public void run()
{
while(true)
{ System.out.println("Thread " + threadNumber + "(" + countDown + ")");
if(--countDown == 0) return;
try{ sleep(100);}
Catch (InterruptedException e)
{
Throw new RuntimeException(e);}
}}
public static void main(String[] args)
{
for(int i = 0; i < 5; i++)
new SimpleThread().start();
System.out.println("All Threads Started");
Metodele clasei Thread
Constructorii
Crearea unui nou obiect Thread
public Thread();
Crearea unui nou obiect Thread cu indicarea obiectului pentru care
va fi activată metoda run().
public Thread(Runnable target);
Analogic constructorului precedent, dar se indică ți numele
obiectului Thread
public Thread(Runnable target, String name);
Crearea unui nou obiect Thread și se indică numele lui.
public Thread(String name);
Crearea unui nou obiect Thread, se indică numele grupului căruia îi
aparâine și obiectul pentru cae va fi activată metoda run().
public Thread(ThreadGroup group, Runnable target);
Analogic constructorului precedent, dar se indică ți numele
obiectului Thread
public Thread(ThreadGroup group, Runnable target, String
name); Crearea unui nou obiect Thread cu indicarea numelui
grupului căruia îi aparâine și numele lui.
public Thread(ThreadGroup group, String name);
Metodele
activeCount apreciază numărul de thread-uri active din grupul
căruia îi aparâine
public static int activeCount();