2016-04-14 18 views
0

Aşağıdaki kod OSX Maverick'lerinde bir kilitlenmeye neden oluyor, "devam ediyor" dizesinin yazdırıldığını görmüyorum, dolayısıyla bunun nedeni olmasını beklerim. Askıya almayı anlıyorum, özgeçmiş kilitlenmelere neden olabilir ama oraya ulaşmak için çok basit olmasını beklemiyordum.System.out.println ile kilitlenme ve askıya alınmış bir iş parçacığı

Sebebi belli nedenlerden dolayı?

Java sürümü java versiyonu "1.8.0_66" Java (TM) SE Runtime Environment (build 1.8.0_66-B17) Java HotSpot (TM) 64-bit sunucu VM (25.66-b17, karışık mod kurmak)

class TestThread { 
    public static void main(String args[]) throws InterruptedException { 
     Thread t = new Thread() { 
      public void run() { 
       while (!isInterrupted()) { 
        System.out.println("looping"); 
       } 
      } 
     }; 

     t.start(); 
     Thread.sleep(1000); 
     t.suspend(); 
     Thread.sleep(5000); 
     System.out.println("resuming"); 
     t.resume(); 
     Thread.sleep(2000); 
     t.interrupt(); 
    } 
} 
+0

Özellikle 't' nedir? – markspace

cevap

2
her şeyden önce

, suspend ve resume derleyici bunları kullanmak için değil sizi anlatıyor, artık yok. Beklenmeyeni bekle.

Artık, konsolu "olabildiğince hızlı" döngü ile "spam" yapıyorsunuz, böylece "devam ediyor" ekrandan spam ediliyor. Yani asla göremezsiniz ve konsolun tamponunu bırakır.

"Döngü" yazdırmayı veya 500 milisaniyelik aralıklarla yazdırmayı açıklarsam, "devam ettirmeyi" iyi izlerim.

+0

Kodumu biçimlendirdiğiniz için teşekkürler okunabilir. Bu işlevlerin kullanılmamasını anlıyorum, ama benim aradığım şey ise nasıl kilitlenebileceğini merak ediyordum. İşleminiz System.out.println ("devam ediyor") çağrısıyla mevcut mu? Ayrıca, çıktı için başka bir dosyaya da çıkış yaptım ve orada "devam" dizesini görmüyorum. Maden beni orada bir tür kilitlenme olduğuna inandırmıyor. –

+0

@RakeshIyer Eh, evet, konsolda "devam" görüyorum. Ancak, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'platformun yerel iş parçacığı tutamaçlarında işlevlerini çağırır (platform başına farklılık gösterir) Kullanımdan kaldırıldıkları için, hiç bir şey yapamazlar ya da tanımlanmamış davranışlar üretebilirler, çünkü aramaya çalıştıkları yerel işlevler artık çalışmaz veya mevcut değildir. –

1

Sadece bir kitap okudum ve neden kilitlenmediğini biliyorum. System.out.println() yöntem burada, bir synchronized yöntemdir onun kodudur: iplik t suspend ing olduğunda

/** 
* Prints a String and then terminate the line. This method behaves as 
* though it invokes <code>{@link #print(String)}</code> and then 
* <code>{@link #println()}</code>. 
* 
* @param x The <code>String</code> to be printed. 
*/ 
public void println(String x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 

yüzden, belki println yöntem haline çalıştırın ve PrintStream örneği kilitlemek, bu yüzden ana iş parçacığı System.out.println("resuming"); çalıştırdığında, Ana iş parçacığı engellenir. Buna chang kodunuzu:

//System.out.println("resuming"); 
    t.resume(); 
    Thread.sleep(2000); 
    t.interrupt(); 
    System.out.println("end"); 

Eğer normal alacak size yardım etmek istiyoruz.

İlgili konular