Toon posts:

[Java] Thread beeindigen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

ik ben een beginnende Java programmeur. Ik heb een class die in
een aparte thread taken uitvoert die door andere threads in een BlockingQueue (Java 5.0) gezet worden.
De code ziet er globaal als volgt uit:

Java:
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
class Executor{

    BlockingQueue<Task> queue;

    public void run(){
    Task task;
    try{
        while( !Thread.interrupted() ){
            task = queue.take();
            execute( task );
        }
        System.out.println( "exited while loop");
    }
    catch( InterruptedException e ){
        System.out.println( "interrupted." );
        return;
    }
    finally{
        // try to execute all tasks that are still in queue
        System.out.println( "finally...");
        cleanUp();
    }
    }

    void execute(){ // ... }
}


Op de een of andere manier blijft de thread altijd draaien, ondanks het feit dat ik interrupt()
aanroep. Wie kan mij vertellen wat ik fout doe? De bedoeling is dat er een cleanUp() gedaan wordt
als de gebruiker het programma beeindigt, of als er iets anders fout gaat.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:32
Ik denk niet dat je echt de thread zomaar ongecontroleerd wilt interupten.

Het is imho beter dat je een method 'Cancel' maakt in die class, die een member variable _cancel (bv) op false zet. Dan kan je zelf beter controleren wanneer je die Thread laat interupten.

bv:
code:
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
class  Executor()
{

     private bool _cancel;

     public Executor() {_cancel = false; }

     public void Run()
     {
           Thread t = new Thread( DoWork );
            t.Start();
     }

      private void DoWork()
      {
           while( _cancel == false )
           {
                ...
           }
      }
      public void Cancel()
      {
           _cancel = true;
      }
}

beetje pseudo-code achtig

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dankjewel whoami, dat ziet er inderdaad netter uit. Maar het is me nog steeds niet duidelijk waarom interrupt() niets doet...

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 22-02 21:17
Volgens mij moet je de Thread.isInterrupted() gebruiken, je moet even goed de JavaDoc lezen van die methods. Thread.interrupted() veranderd namelijk de interrupt status, in tegenstelling tot Thread.isInterrupted().