-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPoste.java
More file actions
109 lines (87 loc) · 2.59 KB
/
Poste.java
File metadata and controls
109 lines (87 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import java.util.Vector;
class Cliente{
private int n;
private static int nCliente;
Cliente(){n=nCliente++;}
public int chi(){return n;}
}
public class Posta{
private static class Sportello{
private int n;
private static int nSportello;
private boolean libero=true;
Sportello(){
n=nSportello++;
}
public boolean libero(){return libero;}
public int n(){return n;}
public void occupa(){libero=false;}
public void libera(){libero=true;}
}
Sportello[] elencoSportelli =new Sportello[6];
int nSportelli;
private Vector<Cliente> coda=new Vector<Cliente>();
Posta(){
elencoSportelli[0]=new Sportello();
elencoSportelli[1]=new Sportello();
elencoSportelli[2]=new Sportello();
nSportelli=3;
}
private int qualeLibero(){
for(int i=0;i<nSportelli; i++)
if(elencoSportelli[i].libero()){
return i;
}
return -1;
}
private void apri(){
if(nSportelli<5){
elencoSportelli[nSportelli]=new Sportello();
nSportelli++;
}
}
private void chiudi(int i){ // chiude lo sportello i-esimo
synchronized(elencoSportelli[i]){
try{
while(!elencoSportelli[i].libero){
elencoSportelli[i].wait();
}
elencoSportelli[i].occupa();
}catch(InterruptedException e){}
}
}
private class GeneraClienti extends Thread{
public void run(){ // genera clienti che si mettono in coda
for(int i=0;i<10;i++){
coda.add(new Cliente());
}
}
}
private class GestoreClienti extends Thread{
private void occupa(final Sportello s, final Cliente c){
synchronized(s){
System.out.println(s +" sta servendo "+ c);
try{
sleep(30);
}catch(InterruptedException e){}
s.notifyAll();
}
}
public void run(){
while(true){
for(int k=0;k<elencoSportelli.length && !coda.isEmpty() ;k++){
if(elencoSportelli[k].libero()){
occupa(elencoSportelli[k],coda.remove(0));
}
}
}
}
}
public static void main(String[]a){
Posta p =new Posta();
GeneraClienti o= p.new GeneraClienti();
o.start();
GestoreClienti l =p.new GestoreClienti();
l.start();
}
}