Witam, czy mógłby mi ktoś powiedzieć co robi dokładnie blok synchronizowany w javie?
Niżej kod, w którym nie rozumiem co się dokładnie dzieje (chodzi mi o czas wykonywania?wątku)
Chodzi mi o te zakomentowane synchronized{} - jak jest zakomentowane to grafika lepiej reaguje, ale dlaczego?
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Watek extends Frame{
private static final long serialVersionUID = 1L;
private Button b1;
private TextArea tekst;
private Licznik lcz;
private Button b2;
public Watek(){
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
dispose();
System.exit(0);
}
});
b1 = new Button("Start/Stop");
tekst = new TextArea(10, 24);
lcz = new Licznik(tekst);
b2 = new Button("Znisz/Stwórz");
b1.addActionListener(lcz);
b2.addActionListener(lcz);
add(b1);
add(b2);
add(tekst);
setLayout(new FlowLayout());
setVisible(true);
setSize(400, 300);
}
private class Licznik implements Runnable, ActionListener{
private TextArea tout;
public boolean koniec = false;
public long licznik = 0;
public boolean b1wcisniety = false;
Thread nt;
public Licznik(TextArea t){
tout = t;
nt = new Thread(this);
nt.start();
}
public void run(){
while(!koniec){
synchronized (this) {
try {
if(b1wcisniety==true){
tout.append("Linia"+licznik+"\n");
licznik++;
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void actionPerformed(ActionEvent e){
tout.append("Przycisk\n");
//synchronized (this) {
if(e.getSource()==b1 && b1wcisniety==false){
tout.append("Wciśnięto (Start)\n");
b1wcisniety=true;
}
else if(e.getSource()==b1 && b1wcisniety==true){
tout.append("Wciśnięto (Stop)\n");
b1wcisniety=false;
notify();
}
else if(e.getSource()==b2 && koniec==false){
koniec=true;
tout.append("Wyłączono wątek licznika\n");
}
else if(e.getSource()==b2 && koniec==true){
koniec=false;
tout.append("Stworzono nowy wątek licznika\n");
nt = new Thread(this);
nt.start();
}
//}
}
}
public static void main(String argv[]){
Watek w = new Watek();
w.setVisible(true);
}
}