Gijos (Threads) Java kalboje

Slides:



Advertisements
Similar presentations
CS Concurrent Programming CS 3331 Fall 2009.
Advertisements

Java threads Threaded class extends thread Synchronized class is a monitor Runnable interface gives thread methods All code is (C) Copyright 1999 by Deitel.
10. Multithreading 1 public class SumTest { public static void main(String a1[]) public static void main(String a1[]) { int a, b, sum; int a, b, sum; a.
Chapter 7 Threads  Threads & Processes  Multi Threading  Class Thread  Synchronized Methods  Wait & Notify.
Unit 141 Threads What is a Thread? Multithreading Creating Threads – Subclassing java.lang.Thread Example 1 Creating Threads – Implementing java.lang.Runnable.
Algorithm Programming Concurrent Programming in Java Bar-Ilan University תשס"ח Moshe Fresko.
11-Jun-15 Producer-Consumer An example of using Threads.
Java Programming Transparency No. 1 Lecture 7. Java Threads Cheng-Chia Chen.
Object-Oriented Software Engineering Concurrent Programming.
16-Jun-15 Producer-Consumer An example of using Threads.
Java Programming Transparency No. 1 Lecture 7. Java Threads Cheng-Chia Chen.
Concurrency Java Threads. Fundamentals Concurrency defines parallel activity Synchronization is necessary in order for parallel activities to share results.
28-Jun-15 Producer-Consumer An example of using Threads.
Lesson 9 Intro to Java Threads. What are threads?  Like several concurrent subprograms running within the same address space.  Within a program, individual.
Threads Just Java: C10–pages 251- C11–pages 275-
Java Programming Transparency No. 1 Lecture 7. Java Threads Cheng-Chia Chen.
„Threads”. Threads Threads - basics A thread is a single sequential flow of control within a program. A thread itself is not a program; it cannot run.
תכנות מקבילי - I יישום ב- Java. References קורס "תכנות מקבילי ומבוזר", הפקולטה למדעי המחשב, הטכניון. קורס "מערכות מידע מבוזרות", הפקולטה להנדסת תעשייה.
Lecture 4 : JAVA Thread Programming
Quick overview of threads in Java Babak Esfandiari (extracted from Qusay Mahmoud’s slides)
Online Appointment Book Implement a Client/Server application for an online appointment book. Client should be a Graphical User Interface application.
Today’s Agenda  Quick Review  Finish Java Threads  The CS Problem Advanced Topics in Software Engineering 1.
Concurrent Programming in Java Dr. Zoltan Papp. Motivation: event driven, responsive systems Sequential approach: while ( true ) { do event = getEventId()
1 Tutorial: CSI 3310 Dewan Tanvir Ahmed SITE, UofO.
Lecture 7. Java Threads Cheng-Chia Chen.
Threads CSCE 190 – Java Instructor: Joel Gompert Wed, Aug 3, 2004.
Java Threads and higher level constructs for doing concurrent programming.
Multithreading in Java Sameer Singh Chauhan Lecturer, I. T. Dept., SVIT, Vasad.
1 5.0 Garbage collector & Threads : Overview Introduction: In this module we discuss the merits and demerits of automated garbage collection over manual.
In Java processes are called threads. Additional threads are associated with objects. An application is associated with an initial thread via a static.
Li Tak Sing COMPS311F. Threads A thread is a single sequential flow of control within a program. Many programming languages only allow you to write programs.
Threads Eivind J. Nordby University of Karlstad Inst. for Information Technology Dept. of Computer Science.
Multithreaded programming  Java provides built-in support for multithreaded programming. A multithreaded program contains two or more parts that can run.
Java Producer-Consumer Monitor From: Concurrent Programming: The Java Programming Language By Steven J. Hartley Oxford University Press, 1998.
6.1 Silberschatz, Galvin and Gagne ©2009 Operating System Concepts with Java – 8 th Edition Module 6: Process Synchronization Codes.
Comunication&Synchronization threads 1 Programación Concurrente Benemérita Universidad Autónoma de Puebla Facultad de Ciencias de la Computación Comunicación.
Threads in Java Threads Introduction: After completing this chapter, you will be able to code your own thread, control them efficiently without.
Thread A thread represents an independent module of an application that can be concurrently execution With other modules of the application. MULTITHREADING.
Threads b A thread is a flow of control in a program. b The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.
Chapter 13: Multithreading The Thread class The Thread class The Runnable Interface The Runnable Interface Thread States Thread States Thread Priority.
Vaizdinė užduotis. Kuriose iš šių valstybių galima pamatyti tokius gyvenamuosius namus? Jemene Tanzanijoje Mongolijoje Indonezijoje A B C D 1.
Многопоточность в Java
Multithreading / Concurrency
THREADS.
SSGG (SWOT): Organizacijos stiprybės ir silpnybės, galimybės ir grėsmės (nustatymas, grupavimas, vertinimas, rezultatas) Pagrindinė literatūra: Lietuvos.
Threads Chate Patanothai.
Java Concurrency.
Pagrindinės sąvokos Hipertekstas ir multimedija
JavaScript kalbos apžvalga
Failai ir jų tvarkymas.
null, true, and false are also reserved.
Condition Variables and Producer/Consumer
2 skyrius Procesai ir gijos 2.1 Ką vadiname procesu 2.2 Proceso būviai
Virtualus kompiuteris
Funkcijos 9 paskaita.
Operacinė sistema Testas 9 klasė
Condition Variables and Producer/Consumer
Pertrauktys (Interrupts)
Daugelio dokumentų sąsaja (angl. Multiple document interface)
Grupinio darbo programinė įranga Lotus Notes
Pranešėjas Jurij Kuznecov
13: Concurrency Definition:  A thread is a single sequential flow of control within a program. Some texts use the name lightweight process instead of thread.
برنامه‌نویسی چندنخی Multi-Thread Programming
class PrintOnetoTen { public static void main(String args[]) {
Computer Science 2 06A-Java Multithreading
Representation and Management of Data on the Internet
Gentle Introduction to Threads
Philosopher Example class PhilosophersShare {
Java Chapter 3 (Estifanos Tilahun Mihret--Tech with Estif)
Presentation transcript:

Gijos (Threads) Java kalboje

Gijos (Thread) apibrėžimas Gija (angl. thread) – tai viena valdymo seka, vykdoma vienoje programoje (procese). Gijos naudojamos tam, kad vykdyti kelias užduotis vienu metu. Gijos yra vykdomos nepriklausomai viena nuo kitos (pvz., kiekviena gija turi savo steką ir programos skaitliuką). http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html

Gijos sukūrimas (1a) Sukurti savo gijos klasę, paveldinčią java.lang.Thread klasę. Perdengti java.lang.Thread klasės metodą public void run() {}. Sukurti gijos objektą ir iškviesti jo metodą public void start(). http://download.oracle.com/javase/tutorial/essential/concurrency/runthread.html

Gijos sukūrimas (2a) public class SimpleThread extends Thread { private String name; public SimpleThread(String string) { this.name = string; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + this.name); try { sleep((long)(Math.random() * 1000)); } catch (InterruptedException ex) {}

Gijos sukūrimas (3a) public class TwoThreadsDemo { public static void main (String[] args) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); }

Gijos sukūrimas (1b) Sukurti klasę, implementuojančią java.lang.Runnable interfeisą. Realizuoti java.lang.Runnable interfeiso metodą public void run() {}. Sukurti java.lang.Thread tipo objektą (giją), paduodant į konstruktorių klasę, implementuojančią java.lang.Runnable interfeisą. Iškviesti sukurtos gijos metodą public void start(). http://download.oracle.com/javase/tutorial/essential/concurrency/runthread.html

Gijos sukūrimas (2b) public class SimpleThread implements Runnable { private String name; public SimpleThread(String string) { this.name = string; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + this.name); try { Thread.sleep((long)(Math.random() * 1000)); } catch (InterruptedException ex) {}

Gijos sukūrimas (3b) public class TwoThreadsDemo { public static void main (String[] args) { SimpleThread threadA = new SimpleThread("Fiji"); SimpleThread threadB = new SimpleThread("Jamaica"); Thread th1 = new Thread(threadA); Thread th2 = new Thread(threadB); th1.start(); th2.start(); }

Gijų būsenos (1) Nauja gija – sukurtas, bet nepaleistas vykdyti gijos objektas. Vykdoma gija – gija, kuri yra paleista naudojant metodą public void start(). Nevykdoma (blokuota) gija – gija, kurios veikimas laikinai pristabdytas. Sustabdyta (nustojusi veikti) gija.

Gijų būsenos (2)

Gijų vykdymo prioritetai (1) Kiekviena gija vykdoma atsižvelgiant į jos prioritetą. Gijos prioritetas nustatomas metodo public final void setPriority(int newPriority) pagalba. Visuomet stengiamasi vykdyti giją, kurios prioritetas yra aukščiausias. Java VM negarantuoja, kad visada pirmiau bus vykdoma aukščiausio prioriteto gija. http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/threads/priority.html

Gijų vykdymo prioritetai (2) Java virtuali mašina nevykdo laiko kvantavimo (time-slicing). Vienodo prioriteto gijos vykdomos viena kitos atžvilgiu priklausomai nuo operacinės sistemos realizacijos. Gija gali būti laikinai pristabdyta, leidžiant veikti kitoms gijoms, naudojant public static void yield() metodą.

Gijų sinchronizacija Reikalinga, kai kelios gijos naudojasi tais pačiais resursais ar duomenimis. Reikalinga, kai gijos turi komunikuoti tarpusavyje ir derinti savo veiksmus. http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

Kritinės programos sekcijos (1) Programos dalys (sekcijos), kurios yra kviečiamos iš skirtingų konkuruojančių gijų vadinamos kritinėmis sekcijomis. Java kalboje kritinėmis sekcijomis gali būti atskiri metodai ar kodo dalys (blokai). Kritinės sekcijos yra nurodomos synchronized raktinio žodžio pagalba. http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

Kritinės programos sekcijos (2) Jei gija iškviečia objekto A metodą pažymėtą kaip synchronized, tai kitos gijos negali iškviesti bet kurio objekto A synchronized metodo, kol pirmoji gija nebaigs darbo su objektu A (kitos gijos užblokuojamos). http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

Kritinės programos sekcijos (3) public class CubbyHole { private int contents; public synchronized int get() { return contents; } public synchronized void put(int value) { contents = value;

Gamintojo/Vartotojo uždavinys (1) Gamintojas (Producer gija) generuoja sveikus skaičius iš intervalo 0 .. 9. Vartotojas (Consumer gija) naudoja gamintojo sugeneruotus skaičius. Gamintojo ir vartotojo komunikavimui naudojamas CubbyHole objektas, kuris saugo sugeneruotus skaičius. http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

Gamintojo/Vartotojo uždavinys (2) public class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i); System.out.println("Producer #" + this.number + " put: " + i); try { sleep((int) (Math.random() * 100)); } catch (InterruptedException e) {

Gamintojo/Vartotojo uždavinys (3) public class Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); System.out.println("Consumer #" + this.number + " got: " + value); try { sleep((int) (Math.random() * 100)); } catch (InterruptedException e) {

Gamintojo/Vartotojo uždavinys (4) public class CubbyHole { private int contents; public synchronized int get() { return contents; } public synchronized void put(int value) { contents = value; // pagrindine programa public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start();

Gamintojo/Vartotojo uždavinys (5) Programos rezultatai, nevykdant pilnos sinchronizacijos tarp gijų: Producer #1 put: 0 Consumer #1 got: 0 Producer #1 put: 1 Consumer #1 got: 1 Producer #1 put: 2 Consumer #1 got: 2 Producer #1 put: 3 Producer #1 put: 4 Producer #1 put: 5 Consumer #1 got: 5 Producer #1 put: 6 Consumer #1 got: 6 Producer #1 put: 7 Producer #1 put: 8 Producer #1 put: 9

wait, notifyAll ir notify metodai (1) Objekto wait metodas priverčia einamąją giją laukti, kol kuri nors kita gija iškvies šio objekto metodą notify ar notifyAll, arba kol pasibaigs nurodytas laiko tarpas. Objekto metodas notify pažadina vieną procesą iš tų, kurie laukia kada šis objektas atsilaisvins. Objekto metodas notifyAll pažadina visus procesus, kurie laukia kada šis objektas atsilaisvins. http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/threads/waitAndNotify.html

wait, notifyAll ir notify metodai (2) Jei metodas notify ar notifyAll iškviečiamas anksčiau, nei objektas pradėjo jo laukti, tai signalas ignoruojamas, todėl gali susidaryti amžinojo laukimo situacija. Metodus wait ir notify kviesti iš metodų, kurie paskelbti kaip synchronized. Kadangi metodo wait vykdymo metu gali susidaryti kokia nors situacija (exception), tai kreipimąsi į jį tikslinga patalpinti į while ciklą, kuris patikrintų vėliavėlę ar atlikti wait.

wait, notifyAll ir notify metodai (3) public class CubbyHole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } available = false; notifyAll(); return contents; } // tesinys kitoje skaidreje

wait, notifyAll ir notify metodai (4) public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } contents = value; available = true; notifyAll();

wait, notifyAll ir notify metodai (5) Programos rezultatai įvykdžius sinchronizaciją tarp Gamintojo ir Vartotojo gijų: Producer #1 put: 0 Producer #1 put: 1 Consumer #1 got: 0 Producer #1 put: 2 Consumer #1 got: 1 Consumer #1 got: 2 Consumer #1 got: 3 Producer #1 put: 3 Consumer #1 got: 4 Producer #1 put: 4 Producer #1 put: 5 Producer #1 put: 6 Consumer #1 got: 5 Producer #1 put: 7 Consumer #1 got: 6 Consumer #1 got: 7 Consumer #1 got: 8 Producer #1 put: 8 Consumer #1 got: 9 Producer #1 put: 9

Gijų grupavimas Gijos gali būti grupuojamos panaudojant java.lang.ThreadGroup klasės objektą. Gijų grupę gali sudaryti keletas pavienių gijų ar gijų grupių. Gijų grupės leidžia manipuliuoti keliomis gijomis vienu metu tarsi tai butu viena gija (pvz. iškviesti visų gijų tą patį metodą). http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/threads/group.html

Gijos darbo nutraukimas (sunaikinimas) Draudžiama naudoti java.lang.Thread klasės metodus stop(), suspend() ir resume(), nes jie sukelia neapibrėžtas objektų būsenas. Gija turi pati tikrinti ar ji turi užbaigti darbą ar ne (paprastai ciklo viduje). http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Ačiū už dėmesį