Java thread, concorrenza

Documenti analoghi
Java Threads. esempi

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread:

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma

Programmazione concorrente in Java

Concorrenza e sincronizzazione

THREAD IN JAVA. Thread. Un thread (lightweight process) è un singolo flusso sequenziale di controllo all interno di un processo

THREAD. Programmazione in rete e laboratorio. Come si crea un thread

I Thread. un thread è uno stream di esecuzione del programma

Multithreading. Multithreading/2

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da:

GESTIONE DEI PROCESSI

Gestione dei thread in Java LSO 2008

Multithreading in Java. Fondamenti di Sistemi Informativi

Java Virtual Machine

Multithreading in Java I parte. Lorenzo Gallucci

Programmazione concorrente con il linguaggio Java

Sincronizzazione con Java

I thread di uno stesso processo condividono dati e codice del processo, ma lo stack di esecuzione ed il program counter sono privati.

Laboratorio di Sistemi Thread Java

Esercitazione 15. Il problema dello Sleeping Barber

I Thread in Java. Sistemi Operativi L-A. I threads in Java

Multi-threading. I programmi Java possono eseguire thread multipli in modalità di concorrenza logica. Come funziona il multi-threading?

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Corso di Linguaggi di Programmazione

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

Thread e Task. L20_MultiThread 2

Definizione di thread Proprietà dei thread in Java Gestione delle priorità nei programmi multithreaded Gruppi di thread Accesso a variabili condivise

19. Introduzione al multi-threading

Java threads (2) Programmazione Concorrente

Sincronizzazione con Java

Programmazione Concorrente in Java

Lezione 15 Programmazione multithreaded

Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002. Sistemi Operativi Corsi A e B. Esercitazioni 7 e 8

Processi e Thread. Walter Cazzola Dipartimento di Informatica e Comunicazione Università à degli Studi di Milano.

Esercizio monitor. Sistemi Operativi T 1

Thread in Java CAPITOLO Richiami di gestione di processi

Programmazione Orientata agli Oggetti in Linguaggio Java

Thread: concetti di base

Lab 1: Java Multithreading

Corso di Programmazione Concorrente. Java Thread. Valter Crescenzi

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Supporto al Sistema Operativo

Programmazione concorrente e threads

Multithreading in Java

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Programmazione di Reti Corso B. 23 Febbraio 2016 Lezione 1(b)

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A lezione 14 - Thread in Java

Un programma concorrente è un programma nel quale diverse computazioni possono essere eseguite allo stesso tempo Alcuni sistemi sono implicitamente

Esercitazione maggio 2011

SISTEMI OPERATIVI. Sincronizzazione in Java (Semafori e barriere) Patrizia Scandurra (MODULO DI INFORMATICA II) LABORATORIO

Laboratorio Reti di Calcolatori Laurea Triennale in Comunicazione Digitale. Anno Accademico 2012/2013

Informatica 3 secondo recupero 13 Settembre 2002

Synchronized (ancora)

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Telematica II 17. Esercitazione/Laboratorio 6

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

Thread THREAD IN JAVA. Un thread (lightweight process) è un singolo flusso sequenziale di controllo all interno di un processo

Riepilogo sulla Concorrenza

Lezione n.6 LPR A - INFORMATICA THREADS:, SINCRONIZZAZIONE ESPLICITA

Esercizio sul Monitor in Java. 18 maggio 2011

24 - Possibili approfondimenti

Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

Multithreading in Java IS-8 1

Ottava Esercitazione. introduzione ai thread java mutua esclusione

JAVA Gestione delle eccezioni e Programmazione concorrente

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Esercitazioni Ingegneria del So2ware 8 Threads. Giordano Tamburrelli tamburrelli@elet.polimi.it h@p://giordano.webfacdonal.com

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Compute engine generici in RMI

Corso sul linguaggio Java

Esercizi sul Monitor in Java. 22 Maggio 2015

Il problema è trovare un modo nel quale gli eventi dell oggetto di riferimento, siano comunicati a tutti gli altri interessati.

Uguaglianza e copia di oggetti

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

La classe Object. Ce li ha anche HelloWorld!!!

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Esempio: Interfacce. Gioco Interfacce

Thread - Handler - Looper

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Il linguaggio C# Thread

Esempio: Interfacce. Gioco Interfacce

Laboratorio di Programmazione di Rete Corso A

Corso di Telematica II

La concorrenza in Java package java.util.concurrent Antonio Furone

Ingegneria del Software

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

Un esercizio d esame. Flavio De Paoli

Polimorfismo parametrico vs polimorfismo per inclusione

Programmazione con Java

Programmazione multi threaded in Python. Linguaggi dinamici A.A. 2010/2011 1

Programmazione 2 - Marco Ronchetti. Fondamenti di Java. Fac.Scienze Università di Trento. Static

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

RTTI Run-time type identification

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

PROCESSI ESEMPIO THREAD. RETI DI CALCOLATORI Linguaggio Java: i Thread CORSO DI. Università degli Studi di Modena e Reggio Emilia

Esercizi della lezione 5 di Java

Algoritmi di Ricerca. Esempi di programmi Java

Transcript:

Java thread, concorrenza laboratorio 1 A.Memo febbraio 2004 il thread principale in Java ogni programma in esecuzione è un thread il metodo main() è associato al main thread per poter accedere alle proprietà del main thread è necessario ottenerne un riferimento tramite il metodo currentthread() bibliografia: Java, Patrick Naughton e Herbert Schildt class ThreadMain { // controllo del thread principale (main) public static void main(string args[ ]) { Thread t = Thread.currentThread(); System.out.println("Thread corrente: " + t); t.setname("mio Thread"); System.out.println("Dopo aver cambiato il nome: " + t); System.out.println(n); catch (InterruptedException e) { ; Thread corrente: Thread[main,5,main] Dopo aver cambiato il nome: Thread[Mio Thread,5,main] 5 4 nome del thread 3 priorità del thread 2 nome del gruppo 1 di appartenenza del thread 1

not alive alive diagramma degli stati dei thread in Java runnable blocked new start() ready time out schedule blocked terminated stop() run() exit executing sleep() sleep() exit sleeping notify() wait() notifyall() waiting suspend() resume() Creazione di un nuovo thread (1) Ci sono due modi per creare un nuovo thread: questo il primo: dichiarare una classe che implementa l interfaccia Runnable, che deve implementare il metodo run per crearla, la classe va istanziata, passata come argomento chiamando la classe Thread, e poi fatta partire con start() Creazione di un nuovo thread (1) class MioThread implements Runnable { MioThread( ) { // codice del costruttore public void run() { // codice eseguito dal nuovo thread MioThread p = new MioThread( ); new Thread(p).start(); class NuovoThreadRun implements Runnable { Thread t; NuovoThreadRun() { t = new Thread(this,"Thread secondario"); System.out.println("\t\tThread figlio: " + t); t.start(); // avvio il nuovo thread public void run() { // corpo del nuovo thread System.out.println("\t\tThread figlio: " + n); Thread.sleep(500); catch (InterruptedException e) { ; System.out.println("\t\tTermine del thread figlio"); 2

class ThreadPrincipaleRun { new NuovoThreadRun(); // creo un nuovo thread secondario System.out.println("Thread padre: " + n); catch (InterruptedException e) { ; Thread padre: Thread[main,5,main] Thread figlio: Thread[Thread secondario,5,main] Thread padre: 5 Thread figlio: 5 Thread figlio: 4 Thread padre: 4 Thread figlio: 3 Thread figlio: 2 Thread padre: 3 Thread figlio: 1 Termine del thread figlio Thread padre: 2 Thread padre: 1 Termine del thread padre Creazione di un nuovo thread (2) Questo l altro modo per creare un nuovo thread: dichiarare una classe derivata da Thread, che deve sovrascrivere il metodo run class MioThread extends Thread { MioThread( ) { // codice del costruttore public void run() { // codice eseguito dal nuovo thread MioThread p = new MioThread( ); p.start(); class NuovoThreadThr extends Thread { NuovoThreadThr() { // creo un nuovo thread con il costruttore super("thread secondario"); // chiamo il costruttore della super System.out.println("\t\tThread figlio: " + this); start(); // avvio il nuovo thread public void run() { // corpo del nuovo thread System.out.println("\t\tThread figlio: " + n); Thread.sleep(500); catch (InterruptedException e) { ; System.out.println("\t\tTermine del thread figlio"); 3

class ThreadPrincipaleThr { new NuovoThreadThr(); // creo un nuovo thread secondario System.out.println("Thread padre: " + n); catch (InterruptedException e) { ; Thread padre: Thread[main,5,main] Thread figlio: Thread[Thread secondario,5,main] Thread padre: 5 Thread figlio: 5 Thread figlio: 4 Thread padre: 4 Thread figlio: 3 Thread figlio: 2 Thread padre: 3 Thread figlio: 1 Termine del thread figlio Thread padre: 2 Thread padre: 1 Termine del thread padre versione a più thread class MultiThread implements Runnable { String nome; Thread t; MultiThread(String nomethread) { // creo un nuovo thread nome = nomethread; t = new Thread(this,nome); System.out.println("\t\tNuovo Thread: " + t); t.start(); // avvio il nuovo thread public void run() { // corpo del nuovo thread System.out.println("\t\t"+nome+": " + n); catch (InterruptedException e) { ; System.out.println("\t\tTermine del thread "+nome); 4

class ThreadMultipliDemo { new MultiThread("Uno"); // creo un nuovo thread secondario new MultiThread("Due"); new MultiThread("Tre"); Thread.sleep(10000); catch (InterruptedException e) { ; Thread padre: Thread[main,5,main] Nuovo Thread: Thread[Uno,5,main] Nuovo Thread: Thread[Due,5,main] Uno: 5 Nuovo Thread: Thread[Tre,5,main] Tre: 5 Due: 5 Uno: 4 Tre: 4 Due: 4 Uno: 3 Tre: 3 Due: 3 Uno: 2 Due: 2 Tre: 2 Uno: 1 Due: 1 Tre: 1 Termine del thread Uno Termine del thread Due Termine del thread Tre Termine del thread padre class ThreadMultipliDemoOK { MultiThread th1 = new MultiThread("Uno"); MultiThread th2 = new MultiThread("Due"); MultiThread th3 = new MultiThread("Tre"); th1.t.join(); th2.t.join(); th3.t.join(); catch (InterruptedException e) { ; Esercizio Realizzare un programma in Java che attivi tre contatori indipendenti (tre thread concorrenti) e ne visualizzi i valori (totali o parziali) in un intervallo massimo di 5 secondi. Il contatore deve incrementare una proprietà interna (pubblica o privata) ed effettuare una visualizzazione ad ogni ciclo. 5

la priorità dei thread Java fissa una scala di valori, che è diversa nelle varie implementazione della JVM questa scala è garantita solo all interno del linguaggio poi viene filtrata e adeguata dal S.O. e dall ambiente hardware class Contatore implements Runnable { // creo nuovo thread [Runnable] int conta = 0; Thread t; private boolean running = true; public Contatore(int p, String nomethread) { // creo un nuovo thread t = new Thread(this,nomeThread); t.setpriority(p); System.out.println("Thread figlio: " + t); public void run() { // corpo del nuovo thread while (running) { conta++; System.out.print("\r"); public void start() { t.start(); public void stop() { running = false; class ContatoreDemo { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); Contatore th1 = new Contatore(Thread.NORM_PRIORITY + 2,"Uno"); Contatore th2 = new Contatore(Thread.NORM_PRIORITY - 2,"Due"); th1.start(); th2.start(); Thread.sleep(5000); catch (InterruptedException e) { ; th1.stop(); th2.stop(); th1.t.join(); th2.t.join(); catch (InterruptedException e) { ; System.out.println("Thread ad alta priorita': "+th1.conta); System.out.println("Thread a bassa priorita': "+th2.conta); Thread padre: Thread[main,10,main] Thread figlio: Thread[Uno,7,main] Thread figlio: Thread[Due,3,main] Thread ad alta priorita': 720371 Thread a bassa priorita': 3947 6

Esercizio Realizzare un programma in Java che attivi tre contatori indipendenti (tre thread concorrenti) e ne visualizzi i valori (totali o parziali) in un intervallo massimo di 5 secondi. Ad ogni contatore venga assegnata una priorità iniziale diversa. Si analizzino i risultati proponendo le relative considerazioni. relazione tra thread in Java e S.O. l applicazione multithread in Java viene vista dal S.O. come: come un unico thread o processo, da gestire in blocco (concorrenza a carico del linguaggio) l applicazione è associata ad un solo processo, ed ogni thread del linguaggio viene associato ad un numero uguale o inferiore di thread del S.O. (Win NT/2000) ad ogni thread dell applicazione un thread di S.O. Method Summary (estratto) static Thread currentthread() Returns a reference to the currently executing thread object. String getname() Returns this thread's name. static Thread currentthread() Returns a reference to the currently executing thread object. int getpriority() Returns this thread's priority. boolean isalive() Tests if this thread is alive. void join() Waits for this thread to die. void run() If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns. void setname(string name) Changes the name of this thread to be equal to the argument name. void setpriority(int newpriority) Changes the priority of this thread. static void sleep(long millis) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds. void start() Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. 7