2015-06-16 18 views
5

Tôi đã nhìn thấy một câu hỏi here hỏi bởi @Tej Kiran đó là chính xác những câu hỏi của tôi nhưng nó không được trả lời, bình luận cuối cùng nói:Làm thế nào để ngăn chặn móc tắt máy khỏi bị bế tắc?

"Bạn có biết nếu có bất kỳ móc tắt máy đăng ký tại của bạn ứng dụng hoặc nếu bất kỳ thư viện nào bạn đang sử dụng có móc khóa tắt là ? Móc tắt là một chuỗi và nếu có một khóa chết trong chuỗi đó khiến nó không bao giờ chấm dứt, JVM sẽ không bao giờ thoát. "

Có một cái móc tắt phương pháp trong chương trình của tôi

Runtime.getRuntime().addShutdownHook(new Thread("Shutdown Hook") { 
    @Override 
    public void run() { 

     System.out.println("---------------"); 
     System.out.printf("%d threads running%n", Thread.activeCount()); 

     Map<Thread, StackTraceElement[]> threads = Thread 
       .getAllStackTraces(); 
     for (Entry<Thread, StackTraceElement[]> e : threads.entrySet()) { 
      Thread t = e.getKey(); 

      System.out.printf("%s\t%s\t%s%n", t.getName(), 
        t.isDaemon(), t.isAlive()); 

      StackTraceElement[] elements = e.getValue(); 

      for (StackTraceElement trc : elements) { 
       System.out.println("\t" + trc); 
      } 
     } 

     System.out.println("---------------"); 

     try {UIUtil.cancelAllTasks();} catch (Throwable e) {e.printStackTrace();}; 

     try {mehad.io.port.ScannerManager.disableAutoHandshake();} catch (Throwable e) {e.printStackTrace();}; 

     try {mehad.io.port.ComPortInterface.getInstance().close();} catch (Throwable e) {e.printStackTrace();}; 

     try { 
      if (lockStream != null) { 
       lockStream.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

Nhưng tôi không biết làm thế nào để phân biệt nếu có một bế tắc trong móc tắt máy của tôi và nếu có bất kỳ, làm thế nào để giải quyết nó .

+0

bạn đã thử giết -3 chưa? hoặc trên kỳ diệu jstack? –

+0

Tôi không biết làm thế nào để làm điều đó ?! @ThomasKrieger –

+0

bạn đang sử dụng windows hay linux? –

Trả lời

0

Để bắt đầu - ShutdownHook của bạn hoạt động tốt. Bây giờ về deadlocks.

Bạn có biết nếu có bất kỳ móc tắt máy nào được đăng ký trong đơn đăng ký của bạn không?

Tôi khá chắc chắn rằng không có những thứ như vậy vì nếu có một bế tắc khác ở một số phần của bên thứ ba thì ứng dụng của bạn sẽ bị khóa ngay cả khi không có móc. Tôi tin rằng nó không phải là một thực tế bởi vì bạn có phàn nàn về mã của bạn - vì vậy mà không có móc của bạn nó hoạt động tốt và do đó không có móc bên thứ ba.

bế tắc của bạn là một trong những cuộc gọi:

try {UIUtil.cancelAllTasks();} catch (Throwable e) {e.printStackTrace();}; 

      try {mehad.io.port.ScannerManager.disableAutoHandshake();} catch (Throwable e) {e.printStackTrace();}; 

      try {mehad.io.port.ComPortInterface.getInstance().close();} catch (Throwable e) {e.printStackTrace();}; 

      try { 
       if (lockStream != null) { 
        lockStream.close(); 
       } 

Thực tế rằng họ đang quấn vào khối try/catch không ngăn cản họ trở bế tắc.

Không có mã nào được cung cấp về các phương pháp này. Ngay cả lockStream.close(); có thể khóa thực hiện của bạn.

Xóa một tài khoản của tôi và xem điều gì đang gây ra sự chặn của bạn. Sau đó đi vào bên trong và xem cái gì thực sự chặn chúng.

0

Câu trả lời của riêng tôi:

bạn biết có vẻ như nó không liên quan gì đến móc tắt máy! Tôi đã sử dụng WindowListener để đóng MainFrame, tôi đã thêm điều kiện nếu hiển thị thông báo cho dù người dùng muốn rời khỏi hay không? và nếu câu trả lời là có, nó sẽ chuyển đến System.exit (0). trước đó không có điều kiện để hỏi trước khi đóng cửa sổ. Và bây giờ nó hoạt động tốt! ngay cả trên một số máy hiếm mà không hoạt động trước đây. Nhưng tôi vẫn không biết làm thế nào nó hoạt động tốt với dòng đó được thêm vào! Tôi sẽ biết ơn nếu có ai có thể giải thích nó hoạt động tốt như thế nào ngay bây giờ!

 this.addWindowListener(new WindowAdapter() { 
        public void windowClosing(WindowEvent ev) { 

         try { 
          ComPortInterface.getInstance().close(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
//this if condition is added to ask if you want to exit or not 
         if (MessageUtil.showYesNo("Exit ?")) { 
          System.exit(0); 
         } 

        // System.exit(0); 
        } 
       }); 
Các vấn đề liên quan