Shembull i Temave Java
Mirë se vini në Shembullin e Thread Java. Procesi dhe Thread janë dy njësi bazë të ekzekutimit. Programimi i konkurencës merret më shumë me temat java.
Procesi
Një proces është një mjedis ekzekutimi i pavarur dhe mund të shihet si një program ose aplikacion. Megjithatë, një program në vetvete përmban procese të shumta brenda tij. Mjedisi i kohës së ekzekutimit Java funksionon si një proces i vetëm i cili përmban klasa dhe programe të ndryshme si procese.
Fije
Fillimi mund të quhet proces i lehtë. Thread kërkon më pak burime për të krijuar dhe ekziston në proces, thread ndan burimet e procesit.
Shembull i Temave Java
Përfitimet Java Thread
- Fijet Java janë të lehta në krahasim me proceset, kërkon më pak kohë dhe burime për të krijuar një fill.
- Temat ndajnë të dhënat dhe kodin e procesit prindëror
- Ndërrimi i kontekstit midis temave është zakonisht më pak i kushtueshëm sesa ndërmjet proceseve.
- Interkomunikimi i temave është relativisht i lehtë sesa komunikimi në proces.
Java ofron dy mënyra për të krijuar një thread në mënyrë programore.
- Zbatimi i ndërfaqes java.lang.Runnable.
- Zgjerimi i klasës java.lang.Thread.
Shembull Java Thread - implementimi i ndërfaqes Runnable
Për ta bërë një klasë të ekzekutueshme, ne mund të implementojmë ndërfaqen java.lang.Runnable dhe të ofrojmë implementim në metodën public void run()
. Për të përdorur këtë klasë si Thread, duhet të krijojmë një objekt Thread duke kaluar objektin e kësaj klase të ekzekutueshme dhe më pas të thërrasim metodën start()
për të ekzekutuar metodën run()
në një fije e veçantë. Këtu është një shembull java thread duke zbatuar ndërfaqen Runnable.
package com.journaldev.threads;
public class HeavyWorkRunnable implements Runnable {
@Override
public void run() {
System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
//Get database connection, delete unused data from DB
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
Shembull Java Thread - zgjerimi i klasës Thread
Ne mund të zgjerojmë klasën java.lang.Thread për të krijuar klasën tonë java thread dhe të anashkalojmë metodën run()
. Pastaj ne mund të krijojmë objektin e tij dhe të thërrasim metodën start()
për të ekzekutuar metodën tonë të ekzekutimit të klasës java thread të personalizuar. Këtu është një shembull i thjeshtë java thread që tregon se si të zgjerohet klasa Thread.
package com.journaldev.threads;
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println("MyThread - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
//Get database connection, delete unused data from DB
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("MyThread - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
Këtu është një program testimi që tregon se si të krijoni një fije java dhe ta ekzekutoni atë.
package com.journaldev.threads;
public class ThreadRunExample {
public static void main(String[] args){
Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
System.out.println("Starting Runnable threads");
t1.start();
t2.start();
System.out.println("Runnable Threads has been started");
Thread t3 = new MyThread("t3");
Thread t4 = new MyThread("t4");
System.out.println("Starting MyThreads");
t3.start();
t4.start();
System.out.println("MyThreads has been started");
}
}
Rezultati i programit të shembullit java thread të mësipërm është:
Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1
Sapo të fillojmë ndonjë thread, ekzekutimi i tij varet nga zbatimi i OS i ndarjes së kohës dhe ne nuk mund ta kontrollojmë ekzekutimin e tyre. Sidoqoftë, ne mund të vendosim prioritet threads, por edhe atëherë nuk garanton që filli me prioritet më të lartë do të ekzekutohet i pari. Ekzekutoni programin e mësipërm disa herë dhe do të shihni se nuk ka asnjë model të fillimit dhe përfundimit të fijeve.
Runnable vs Thread
Nëse klasa juaj ofron më shumë funksionalitet sesa thjesht ekzekutimin si Thread, duhet të implementoni ndërfaqen Runnable për të ofruar një mënyrë për ta ekzekutuar atë si Thread. Nëse qëllimi i vetëm i klasës suaj është të ekzekutohet si Thread, mund ta zgjeroni klasën Thread. Implementimi i Runnable është i preferuar sepse java mbështet zbatimin e ndërfaqeve të shumta. Nëse zgjeroni klasën Thread, nuk mund të zgjeroni asnjë klasë tjetër. Këshillë: Siç e keni vënë re se thread nuk kthen asnjë vlerë, por çfarë nëse duam që thread-i ynë të bëjë disa përpunime dhe më pas ta kthejë rezultatin në programin tonë të klientit, kontrolloni Java 8 Functional Ndërfaqet.