PURWAKA. Pakdhe Petya
Dadi, kita pengin ngisi botol banyu. Ana botol lan keran banyune Pakdhe Petya. Pakdhe Petya duwe kran anyar sing dipasang, lan dheweke terus memuji kaendahane. Sadurunge, dheweke mung nggunakake keran lawas sing mampet, mula garis ing botol kasebut gedhe banget. Sak wise rada ngomel, keprungu swara isi banyu saka arah tumpahan, 2 menit botole isih tahap ngisi, antrian sing biasane wis ngumpul nang mburiku, lan gambaran sing ana ing sirahku yaiku kepriwe Pakdhe. Petya mung milih molekul H2O sing paling apik ing botol kita. Pakdhe Petya, sing dilatih kanthi urip, nenangake wong sing agresif lan janji bakal rampung kanthi cepet. Sawise rampung karo botol, dheweke njupuk sing sabanjure lan nguripake tekanan biasa, sing ora nuduhake kabeh kemampuan tunyuk anyar. Wong ora seneng...
Teori
Multithreading minangka kemampuan platform kanggo nggawe macem-macem utas ing siji proses. Nggawe lan nglakokake thread luwih gampang tinimbang nggawe proses, dadi yen perlu kanggo ngleksanakake sawetara tumindak podo ing siji program, Utas tambahan digunakake. Ing JVM, program apa wae mlaku ing utas utama, lan liyane diluncurake. Ing proses sing padha, benang bisa ijol-ijolan data karo siji liyane. Nalika miwiti utas anyar, sampeyan bisa ngumumake minangka utas pangguna nggunakake metode kasebut
setDaemon(true);
Utas kuwi bakal mati kanthi otomatis yen ora ana Utas mlaku liyane. Utas nduweni prioritas kerja (pilihan prioritas ora njamin yen utas prioritas paling dhuwur bakal rampung luwih cepet tinimbang utas prioritas sing luwih murah).
- MIN_PRIORITY
- NORM_PRIORITY (standar)
- MAX_PRIORITY
Cara dhasar nalika nggarap stream:
run()
- executes thread
start()
- miwiti thread
getName()
– ngasilake jeneng thread
setName()
– nemtokake jeneng stream
wait()
– metode warisan, utas ngenteni cara diarani notify()
saka utas liyane
notify()
- cara sing diwarisake, nerusake thread sing wis mandheg sadurunge
notifyAll()
– cara warisan, nerusake sadurunge mandegake Utas
sleep()
– ngaso stream kanggo wektu tartamtu
join()
- ngenteni thread rampung
interrupt()
- ngganggu eksekusi thread
Cara liyane bisa ditemokake
ing kene. Wektu kanggo mikir babagan utas anyar yen program sampeyan duwe:
- Akses jaringan
- Akses sistem file
- GUI
Kelas thread
Utas ing basa Jawa digambarake minangka kelas
Thread
lan turunane. Conto ing ngisor iki minangka implementasine prasaja saka kelas stream.
import static java.lang.System.out;
public class ExampleThread extends Thread{
public static void main(String[] args) {
out.println("Основной поток");
new ExampleThread().start();
}
@Override
public void run() {
out.println("Новый поток");
}
}
Akibaté, kita entuk
Основной поток
Новый поток
Ing kene kita nggawe kelas lan nggawe turunan kelas
Thread
, sawise nulis metode utama () kanggo miwiti utas utama lan ngilangi metode
run()
kelas
Thread
. Saiki, sawise nggawe conto kelas kita lan nglakokake metode sing diwarisake,
start()
kita bakal mbukak thread anyar sing kabeh sing diterangake ing awak metode kasebut bakal ditindakake
run()
. Iku muni rumit, nanging katon ing conto kode kabeh kudu cetha.
Antarmuka Runnable
Oracle uga nyaranake ngleksanakake antarmuka kanggo miwiti thread anyar
Runnable
, kang menehi kita luwih keluwesan desain saka mung warisan kasedhiya ing conto sadurungé (yen katon ing sumber saka kelas
Thread
sampeyan bisa ndeleng sing uga ngleksanakake antarmuka
Runnable
). Ayo nggunakake cara sing disaranake kanggo nggawe thread anyar.
import static java.lang.System.out;
public class ExampleRunnable implements Runnable {
public static void main(String[] args) {
out.println("Основной поток");
new Thread(new ExampleRunnable()).start();
}
@Override
public void run() {
out.println("Новый поток");
}
}
Akibaté, kita entuk
Основной поток
Новый поток
Conto banget padha, amarga Nalika nulis kode, kita kudu ngetrapake cara abstrak
run()
sing diterangake ing antarmuka
Runnable
. Ngluncurake thread anyar rada beda. Kita nggawe conto kelas
Thread
kanthi menehi referensi menyang conto implementasi antarmuka minangka parameter
Runnable
. Pendekatan iki sing ngidini sampeyan nggawe utas anyar tanpa langsung marisi kelas
Thread
.
Operasi dawa
Conto ing ngisor iki bakal nuduhake kanthi jelas keuntungan nggunakake pirang-pirang benang. Ayo dadi ngomong kita duwe tugas prasaja sing mbutuhake sawetara petungan dhowo, sadurunge artikel iki kita bakal wis ditanggulangi ing cara,
main()
mbok menawa bejat mudhun menyang cara kapisah kanggo ease saka pemahaman, malah kelas, nanging inti bakal padha. Kabeh operasi bakal ditindakake kanthi urutan siji-sijine. Ayo simulasi petungan bobot abot lan ngukur wektu eksekusi.
public class ComputeClass {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
for(double i = 0; i < 999999999; i++){
}
System.out.println("complete 1");
for(double i = 0; i < 999999999; i++){
}
System.out.println("complete 2");
for(double i = 0; i < 999999999; i++){
}
System.out.println("complete 3");
long timeSpent = System.currentTimeMillis() - startTime;
System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
}
}
Akibaté, kita entuk
complete 1
complete 2
complete 3
программа выполнялась 9885 миллисекунд
Wektu eksekusi ninggalake akeh sing dikarepake, lan kabeh wektu iki kita ndeleng layar output kosong, lan kahanan kasebut meh padha karo crita babagan Pakdhe Petya, mung saiki ing peran kita, para pangembang, ora entuk manfaat saka kabeh kemampuan piranti modern. Kita bakal nambah.
public class ComputeClass {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
new MyThread(1).start();
new MyThread(2).start();
for(double i = 0; i < 999999999; i++){
}
System.out.println("complete 3");
long timeSpent = System.currentTimeMillis() - startTime;
System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
}
}
class MyThread extends Thread{
int n;
MyThread(int n){
this.n = n;
}
@Override
public void run() {
for(double i = 0; i < 999999999; i++){
}
System.out.println("complete " + n);
}
}
Akibaté, kita entuk
complete 1
complete 2
complete 3
программа выполнялась 3466 миллисекунд
Wektu mlaku wis suda banget (efek iki bisa uga ora bisa digayuh utawa bisa uga nambah wektu eksekusi ing prosesor sing ora ndhukung multithreading). Wigati dicathet yen benang bisa rampung, lan yen pangembang mbutuhake prediktabilitas tumindak, dheweke kudu ngetrapake kanthi mandiri kanggo kasus tartamtu.
Kelompok thread
Utas ing basa Jawa bisa digabung dadi klompok, kelas digunakake kanggo iki
ThreadGroup
. Klompok bisa kalebu benang tunggal lan kabeh klompok. Iki bisa dadi trep yen sampeyan kudu ngganggu aliran sing gegandhengan, contone, karo jaringan nalika sambungan ilang. Sampeyan bisa maca liyane babagan grup
ing kene, muga-muga topik kasebut wis dadi luwih jelas kanggo sampeyan lan pangguna sampeyan bakal seneng.
GO TO FULL VERSION