# Thread pausieren und wieder starten



## Odi1234 (11. Mai 2016)

Hallo zusammen,

ich habe zwei Probleme. Und zwar bin ich grade ein "Spiel" am programmieren, bei den sich 2 Bälle (später sollen per Button noch mehr dazu kommen) in einem Feld bewegen. 
Jetzt habe ich einen Start und einen Stop Button in mein Layout eingefügt, welches den aktuellen Thread stoppen soll. Leider wird beim stoppen der komplette Thread gefreezt, halt so lange bis der Thread.sleep() abgelaufen ist. Wie mache ich das, dass ich ohne zeitliche begrenzung die Buttons jeder Zeit drücken kann und der Thread dann an der selben stelle vor dem stoppen wieder weiter läuft? 

Außerdem hab ich das Problem, dass sich die Bälle überschneiden, sie sollen aber von einander abprallen.. 

Danke für eure Hilfe!!!


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Ball extends JPanel{
    private static final int box_breite = 640;
    private static final int box_hoehe = 480;
   
    //Ball 1
    private float ball_radius = 75;
    private float ball_x = ball_radius + 50;
    private float ball_y =ball_radius + 20;
    private float ball_geschX = 3;
    private float ball_geschY = 2;
   
    //private float mittelpunkt = ball_radius;
   
    //Ball 2
    private float ball_radius2 = 50;
    private float ball_x2 = ball_radius2 + 200;
    private float ball_y2 = ball_radius2 + 250;
    private float ball_geschX2 = 2;
    private float ball_geschY2 = 3;
   
   
    private boolean b = false;
   
    //private float mittelpunkt2 = ball_radius2;
    //

/*
    JButton start = new JButton ("Start");
    JButton stop = new JButton ("Stop");
   
    JPanel panel = new JPanel();
        panel.add(start);
        panel.add(stop);
        panel.setVisible(true);
    */
   
    private static final int update_rate = 30;
   
      @Override
       public void paintComponent(Graphics g) {
          super.paintComponent(g);  
    
          g.setColor(Color.WHITE);
          g.fillRect(0, 0, box_breite, box_hoehe);
        
          //Ball 1
          g.setColor(Color.BLACK);
          g.fillOval((int) (ball_x - ball_radius), (int) (ball_y - ball_radius),
                (int)(2 * ball_radius), (int)(2 * ball_radius));
         
          //Ball 2
          g.setColor(Color.RED);
          g.fillOval((int) (ball_x2 - ball_radius2), (int) (ball_y2 - ball_radius2),
                    (int)(2 * ball_radius2), (int)(2 * ball_radius2));
         
       }
   
    public Ball (){
        this.setPreferredSize(new Dimension(box_breite, box_hoehe));
        JPanel panel = new JPanel ();
        JButton start = new JButton ("Start");
         JButton stop = new JButton ("Stop");
          panel.add(start);
          panel.add(stop);
          add(panel, BorderLayout.EAST);
         
        //Thread für Ball 1
        Thread game = new Thread(){
            public void run(){
                while(true){
                    ball_x += ball_geschX;
                    ball_y += ball_geschY;
                     
                       if (ball_x - ball_radius < 0) {
                           ball_geschX = -ball_geschX;
                           ball_x = ball_radius;
                       } else if (ball_x + ball_radius > box_breite) {
                           ball_geschX = -ball_geschX;
                           ball_x = box_breite - ball_radius;
                       }
                      
                       if (ball_y - ball_radius < 0) {
                           ball_geschY = -ball_geschY;
                           ball_y = ball_radius;
                       } else if (ball_y + ball_radius > box_hoehe) {
                           ball_geschY = -ball_geschY;
                           ball_y = box_hoehe - ball_radius;
                       }
                      
                       /*
                     //Wenn die Distanz zwischen den Mittelpunkten zweier Kreise kleiner ist als die Summe ihrer Radien, so liegt eine Kollision vor
                      
                       if(mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2 || mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2){
                           ball_geschX = -ball_geschX;
                           ball_x = ball_x - ball_radius;
                          
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = ball_x2 - ball_radius2;
                          
                       }else if (mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2 ||mittelpunkt+mittelpunkt2 < ball_radius+ball_radius2){
                           ball_geschY = -ball_geschY;
                           ball_y =  ball_y - ball_radius;
                          
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = ball_y2 - ball_radius2;
                    
                       }
                       */
                       repaint();
                       try {
                          Thread.sleep(1000 / update_rate); 
                       } catch (InterruptedException ex) { }
                }
            }
        };
        //game.start();
       
        //Thread für Ball 2
        Thread game2 = new Thread(){
            public void run(){
                while(true){
                    ball_x2 += ball_geschX2;
                    ball_y2 += ball_geschY2;
                     
                       if (ball_x2 - ball_radius2 < 0) {
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = ball_radius2;
                       } else if (ball_x2 + ball_radius2 > box_breite) {
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = box_breite - ball_radius2;
                       }
                      
                       if (ball_y2 - ball_radius2 < 0) {
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = ball_radius2;
                       } else if (ball_y2 + ball_radius2 > box_hoehe) {
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = box_hoehe - ball_radius2;
                       }
                      
                    /*  
                     //falls kolidierung
                       if(ball_x == ball_x2){
                           ball_geschX2 = -ball_geschX2;
                           ball_x2 = ball_radius2;
                       } else if (ball_y == ball_y2){
                           ball_geschY2 = -ball_geschY2;
                           ball_y2 = ball_radius2;
                       }
                       */
                      
                       repaint();
                       try {
                          Thread.sleep(1000 / update_rate); 
                       } catch (InterruptedException ex) { }
                }
            }
        };
        //game2.start();
       
       
        start.addActionListener(new ActionListener(){
           
            @Override
            public void actionPerformed(final ActionEvent e){
                    game.start();
                    game2.start();
                    b = true;
                   
            }
           
            }
        );
       
        stop.addActionListener(new ActionListener(){
           
            @Override
            public void actionPerformed(final ActionEvent e){
           
                try {
                   
                      b = false;
                     
                      if(b == false){
                            Thread.sleep(1000);
                            //game2.sleep(1000);
                      }
                     
                      if(b == true){
                      game.start();
                      game2.start();
                     
                      }
                   } catch (InterruptedException ex) { }
                   
                }
               
            }
        );
       
    }
   
    public static void main(String[]args){
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                JFrame frame = new JFrame("Bouncing Ball");

              
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new Ball());
                frame.pack();
                frame.setVisible(true);
             }
          });
    }
}
```


----------



## Flown (11. Mai 2016)

Am besten mit `Object::wait` und `Object::notify`. HIER oder HIER ein Tutorial.


----------



## VfL_Freak (11. Mai 2016)

Moin,

hier noch der Link zur API: https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html

Gruß Klaus


----------

