Merhaba, Java'da Thread.start() ile OS seviyesinde canlı bir thread oluşturuyorum. (Yanlışsam düzeltiniz.) Bu thread ile tek bir DB operasyonu gerçekleştirmek istiyorum. Yani herhangi bir döngü sözkonusu değil. Operasyon bittikten sonra oluşturulan bu thread'in artık işlevi kalmamış oluyor ve yok etmek istiyorum. destroy() methodu güvensiz olduğu için kullanılmaması söyleniyor. Peki artık OS seviyesindeki bu thread'i nasıl yok edebilirim? Yada yok etmeli miyim?

soruldu: 13 Eyl '12, 02:28

yunusemre's gravatar image

yunusemre
16112
cevap kabul oranı: 0%


 public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);

                synchronized(this) {
                    while (threadSuspended && blinker==thisThread)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

    public synchronized void stop() {
        blinker = null;
        notify();
    }

Güvenli bir thread durdurma örneği. bu arada destroy dediğiniz gibi güvenli olmayan ve uzak durulması gereken bir metod çünkü dead-lock 'lara sebebiyet veriyor.

Yukarıda güvenli bir şekilde Thread'leri durdurmak için bir örnek var. Örnek hakkında daha detaylı bilgi için lütfen buradaki kaynağı inceleyiniz.

permanent link

cevaplandı: 13 Eyl '12, 03:15

Turgay%20Can's gravatar image

Turgay Can
8.3k63798
cevap kabul oranı: 18%

Çözüm için teşekkürler fakat burada döngü içerisinde olan bir threadin bir kontrol yardımıyla çalışıp çalışmaması sözkonusu. Benim case'imde run içindeki çalışan kod'un işi bitiyor (evet,yukarıdaki örnekte blinker'ın null yapılması gibi) ama bu artık çalışmayan thread'in yok olmasına sebep olmuyor. Yani nasıl ki JVM'de kullanılmayan nesneler GC tarafından toplanıyor ve GC olmasaydı bir sürü çöp nesne olacaktı, aynı şekilde kullanılmayan threadleri toplayan bir yapı var mı?start() ile OS seviyesinde yeni bir thread oluşturduğum için çöp ve kullanılmayan yüzlerce thread'in olması kötü olacaktır.

(13 Eyl '12, 03:29) yunusemre yunusemre's gravatar image
2

http://journals.ecs.soton.ac.uk/java/tutorial/java/javaOO/garbagecollection.html buradaki makaleyi okumanı tavsiye ederim.

"An object is eligible for garbage collection when there are no more references to that object. References that are held in a variable are naturally dropped when the variable goes out of scope. Or you can explicitly drop an object reference by setting the value of a variable whose data type is a reference type to null. "

Aradığın cevap ;)

Thread'i null layacağın için GC toplayacaktır.

(13 Eyl '12, 04:13) Turgay Can Turgay%20Can's gravatar image

Ayrıntılı ve referanslar cevap için teşekkürler. Anlamadığım örnekte blinker'a atama nerede yapılıyor? blinker Thread tipinde bir değişken doğru mu?

(13 Eyl '12, 07:48) yunusemre yunusemre's gravatar image

kod içinde zaten while dongusu içine girebilme koşulu blinker ile thisThread 'in eşit olma koşulu hali ile aynı nesne tipindedir.

(13 Eyl '12, 07:54) Turgay Can Turgay%20Can's gravatar image

Peki, nesnenin içinde yine kendi referansına null atamayı tam anlamadım ama kod içinde bir çözüm bulmaya çalışacağım. Bir de OS seviyesindeki thread'in, onu kullanan JVM üzerindeki Thread nesnesini GC'nin temizlemesiyle temizleneceğini düşünüyorum artık. Teşekkürler.

(13 Eyl '12, 08:21) yunusemre yunusemre's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×31

Soruldu: 13 Eyl '12, 02:28

Görüntüleme: 923 kez

Son güncelleme: 13 Eyl '12, 08:21

powered by BitNami OSQA