# Thread lässt sich mit interrupt() nicht unterbrechen



## Gast (21. Sep 2008)

Hallo,
um bei einem Programm alle paar Sekunden eine Serverabfrage zu machen habe ich diese in eine Klasse gepackt und runnable implementiert. Wird in meiner GUI eine Checkbox gesetzt dann startet der Thread problemlos, mache ich den Hacken weg, läuft der Thread einfach weiter und setzt den interrupt-Flag nicht auf true.


```
package Editor;

import java.net.*;
import java.io.*;

public class Client implements Runnable
{
 Socket server=null;
 String version,log;
	
 public Client(String version)	
 {
  this.version=version;	 
 }
 
 public void run()
 {
  while(!Thread.currentThread().isInterrupted()) 
  { 
  try //Aufbau der Serververbindung und Abfrage
  {
   server=new Socket("192.168.178.22",3141);
   
   InputStream input=server.getInputStream();
   OutputStream output=server.getOutputStream();
   DataInputStream in=new DataInputStream(input);
   DataOutputStream out=new DataOutputStream(output);
   
   out.writeUTF("gpeditor");
   out.writeUTF(version);
   log=in.readUTF();
   System.out.println(log);
   //return log;
  }
  catch(UnknownHostException e)
  {
   System.out.println("Keine Verbindung zum Server gefunden!");
   //return "Es ist ein Fehler aufgetreten";
  }
  catch(IOException e)
  {
	System.out.println("Keine Verbindung zum Server gefunden");
	//return "Es ist ein Fehler aufgetreten";
  }
  finally
  {
	if(server!=null)
	try
   {
    server.close();
   }
   catch(IOException e)
   {
   System.out.println("Networkstream kann nicht geschlossen werden");
   }
  }
  
  try
  {
  Thread.currentThread().sleep(5000);
  }
  catch (InterruptedException e)
  {
  System.out.println("Unterbrechung im Sleep");
  Thread.currentThread().interrupt();

  }
  }
  
 }
 
}
```

Das ganze wird in der MainFrame-Klasse gesteuert


```
public void itemStateChanged(ItemEvent e)
 {
	 
  if(e.getSource()==autoupdate)
  {
  Thread t1=new Thread(new Client(version));  
   if(autoupdate.isSelected())
   {	   
   t1.start();
   System.out.println(t1.isInterrupted());
   } 
 
  if(autoupdate.isSelected()==false)
   {
	System.out.println("FLAG!!!");
    System.out.println(t1.isInterrupted());	
    t1.interrupt();
    System.out.println(t1.isInterrupted());
   }
  }
```


----------



## SlaterB (21. Sep 2008)

wenn ein Thread gerade schläft oder wartet, also eine InterruptedException empfangen kann bzw. catchen muss, 
dann erzeugt interrupt(); eine solche Exception, setz aber den Status NICHT

anderenfalls wird der Interrupted-Status gesetzt

------

> catch (InterruptedException e)
>  {
>  Thread.currentThread().interrupt(); 

hmm?


----------



## FArt (22. Sep 2008)

SlaterB hat gesagt.:
			
		

> > catch (InterruptedException e)
> >  {
> >  Thread.currentThread().interrupt();
> hmm?



siehe: http://www.javaspecialists.co.za/archive/Issue146.html


----------



## Gast (22. Sep 2008)

Aber das is doch genau das was ich auch gemacht habe sehe meine Fehler da nicht?!


----------



## SlaterB (22. Sep 2008)

```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        Thread t1 = new Thread(new Client("x"));
        t1.start();
        Thread.sleep(1000);
        System.out.println("FLAG!!!");
        System.out.println("Main vor inter: " + t1.isInterrupted());
        t1.interrupt();
        System.out.println("Main nach inter: " + t1.isInterrupted());
        Thread.sleep(1000);
        System.out.println("Main nach sleep: " + t1.isInterrupted());
    }
}


class Client
    implements Runnable
{
    String version, log;

    public Client(String version)
    {
        this.version = version;
    }

    public void run()
    {

        while (!Thread.currentThread().isInterrupted())
        {
            // Aufbau der Serververbindung und Abfrage
            try
            {
                Thread.currentThread().sleep(5000);
            }
            catch (InterruptedException e)
            {
                System.out.println("Client: Unterbrechung im Sleep1: " + Thread.currentThread().isInterrupted());
                Thread.currentThread().interrupt();
                System.out.println("Client: Unterbrechung im Sleep2: " + Thread.currentThread().isInterrupted());
            }
        }

        System.out.println("Client: bald Ende");

        for (int j = 0; j < 10; j++)
        {
            for (int i = 0; i < 2000000; i++)
            {

            }
            System.out.println("j: " + j);
        }
        System.out.println("Client: nun endlich Ende");
    }
}

---------

Ausgabe:

FLAG!!!
Main vor inter: false
Client: Unterbrechung im Sleep1: false
Client: Unterbrechung im Sleep2: true
Client: bald Ende
j: 0
j: 1
j: 2
j: 3
Main nach inter: true
j: 4
j: 5
j: 6
j: 7
j: 8
j: 9
Client: nun endlich Ende
Main nach sleep: false
```


----------



## Mercynary (23. Okt 2008)

Ich habe ein ähnliches Problem und bei mir funktioniert es nicht mit dem interrupt() im catch(). Ich glaube es liegt an daran, dass socket.receive() 'weiterhorcht' obwohl der Thread ansich interrupted ist.


----------



## FArt (24. Okt 2008)

Ich kenne dein socket.receive() nicht, aber die Lösung wird dort in der API Doku zu finden sein.


----------

