Lõimed Väikses lihtsas programmis on enamasti üks tööjärg. Käske täidetakse üksteise järel. Enne ei alustata uut toimingut, kui eelmine on valmis. Sellist tööjärge nimetatakse lõimeks (thread). Lõime peatumine Lõim võib peatuda näiteks ootamaks sisestust kasutajalt, andmeid Internetist või on ta lihtsalt mingiks ajaks seisma pandud. Siis ei toimu programmis enne midagi, kui ollaks ootamise kohast üle saanud. Ühelõimelises programmis saab vigu leida, kontrollides iga käsu järel et see oleks täidetud korrektselt. Pole karta, et muutujad "salapäraselt" oma väärtusi muudaksid. import java.io.*; public class Loim1{ public static void main(String argumendid[]) throws Exception{ System.out.println("Oodatakse reavahetust"); new BufferedReader(new InputStreamReader(System.in)).readLine(); System.out.println("Lihtsalt 5 sekundiline paus"); Thread.sleep(5000); System.out.println("Programmi ots"); } } Mitmelõimeline programm Kui programm peab sooritama korraga mitu teineteisest sõltumatut tegevust, on mõistlik nad tööle panna eraldi lõimedena, et peatus ühes lõimes ei takistaks teise töö sooritamist. Näiteks nagu kasutajatega suhtleval Interneti serveril on mõistlik luua iga kasutaja jaoks omaette lõim, et server saaks samaaegselt teenindada mitut kasutajat ilma et programmi looja peaks muretsema arvuti tööaja jagamise üle kasutajate vahel. Järgnevas näites on lõime alamklass Pall2. Igal pallil on koordinaadid x ja y ning iga sammuga muutuvad need dx ja dy võrra. Iga pall liigub omaette lõimes, s.t. programmi muudest osadest sõltumatult. Pall alandab enese prioriteeti, s.t. et protsessori tööaja jagamisel loeb ta end keskmiselt vähem tähtsamaks. Prioriteedi alandamine on vajalik selleks, et pallide liigutamine ei hakkaks märkimisväärselt aeglustama teisi lõimi, näiteks ekraanile joonistamist. Muidu võib juhtuda, et suure hulga pallide puhul jäävad ülejäänud tegevused suhteliselt unarusse. Käsk yield tähendab, et lõim annab oma tööjärje üle järgmisele ning asub ise järjekorda uuesti protsessori aega ootama. Raami alamklass Loim2 loob enesele viis palli isendit ning laseb nad liikuma. Loim2 ise realiseerib liidest Runnable, s.t., et tema run-meetodit on samuti võimalik panna tööle eraldi lõimes. Selle lõime ülesandeks on joonistada iga natukese aja tagant uus ekraanipilt vastavalt pallide uutele koordinaatidele. import java.awt.*; public class Loim2 extends Frame implements Runnable{ Pall2[] pallid; public Loim2(){ pallid=new Pall2[5]; for(int i=0; iparem)dx=-Math.abs(dx); if(y>all)dy=-Math.abs(dy); if(xvanasumma){ PrintWriter faili=new PrintWriter(new FileWriter(failinimi)); faili.println(uusnimi); faili.println(uussumma); faili.close(); } } } sc.close(); }catch(Exception e){ } } } Kokkuvõte Lõim on programmi tööjärg. Ühes lõimes täidetakse käske järgemööda. Lõime saab ootama panna käsuga Thread.sleep, andes parameetriteks ootamise aja millisekundites. Samuti saab lõime panna ootama ükskõik millise objekti taha. Sellisese ootamise lõppemiseks peab miski ütlema sellele objektile notifyAll, mille tulemusena lastakse objekti taga ootaval lõimel edasi töötada. Lõim jääb ootama ka näiteks kasutajalt sisestust või võrgust andmeid oodates. Programmisiseste suhteliselt sõltumatute tegevuste korral saab need panna jooksma eraldi lõime. Sel juhul jagatakse protsessori tööaega lõimede vahel. Lõimede prioriteeti saab muuta, andes mõnele lõimele enam või vähem ressursse kui teistele. Kui on vaja hoolitseda, et mingid tegevused ei toimuks üheaegselt, saab neile seada monitori.