Hej, zaczynam zabawę ze współbieżnością w javie. Próbuję zrobić prostą animację na dwóch wątkach (każdy wątek rysuje koło i przesuwa je po ekranie od lewej do prawej). Problemem jest to że oba koła rysują się "na sobie" a ja chciałbym żeby drugie koło "poczekało" aż będzie miało miejsce do narysowania. Synchronizację chciałbym zapewnić za pomocą semaforów z pakietu java.util.concurrent.

import java.awt.*;
import java.applet.*;

public class Anim2 extends Applet
{
  private static final long serialVersionUID = -705555689585339843L;
  //public Thread thread;
  Image image;
  Graphics gc;
  int x, y, r;    
  int w, h;   
  Sam sa= new Sam();
  Sam ss=new Sam();

  public void init()
  {
   // thread = null;
    sa.start();
    ss.start();
    this.setBounds(0, 0, 500, 80);
    w=getSize().width;
    h=getSize().height;
    x=0;
    y = h/6;
    r = 45;
    image=createImage(w,h);
    gc = image.getGraphics();  
    gc.fillRect(0, 0, w, h); 

  }

   public void paint(Graphics g){
     g.drawImage(image,0,0,this);
     g = image.getGraphics();
     g.setColor(Color.white);
     g.fillRect(0,0,w,h);    

     g.setColor(Color.black);
     g.fillOval(sa.x, y, r, r);
     g.fillOval(ss.x, y, r, r);

     repaint();  
   }

  public void update(Graphics g){
     paint(g);
   } 
}

import java.awt.Color;
import java.awt.Graphics;

public class Sam  implements Runnable {
    Graphics gc;
     public Thread thread;
     int x, y; 
     public Sam(){
         thread=null;
         x=0;
         y=0;
     }
     public void start()
      {
        if (thread == null) {
          thread = new Thread(this);
          thread.start();
        }
      }

     public void stop()
      {
        if (thread != null){
          thread = null;
       }
      }
    public void run() {
        while(thread!=null)
        {
          x ++;      
          if(x == 500)  x = (int) (-80/1.5);
          try {
            Thread.sleep(5);
          } catch(InterruptedException e){}
       }    
    }

}