2012-08-25 30 views
6

Có cách nào có thể để thêm đu vào móc tắt máy (nghĩa là, hiển thị cửa sổ bật lên khi máy ảo tắt)?Làm thế nào để sử dụng đu trong móc tắt?

Tôi nhận ra rằng nếu tôi cố gắng tạo một JFrame mới, nó sẽ cho tôi một lỗi, vì nó cố gắng đăng ký một móc tắt máy, mà không thành công như máy ảo đã tắt. Tôi chỉ tự hỏi nếu có trong thực tế cách nào để khắc phục

+3

tôi sẽ nói không, và thậm chí nếu bạn coud, tôi muốn khuyên bạn không – MadProgrammer

+0

@MadProgrammer Tôi đã nhìn xung quanh, và không thể tìm thấy bất cứ điều gì, nhưng tôi đã suy nghĩ chúng ta có thể như nhiều ứng dụng cung cấp cho bạn một cửa sổ popup, không chỉ khi đóng cửa, mà là nếu bạn tắt máy tính (lần lượt tắt máy ảo Java) –

+0

Tôi đã có một chương trình gần đây ném một ngoại lệ vì một nhà phát triển đang truy cập vào một Swing Component trong một hook bị đóng (theo Java 7 tôi nghĩ). Tôi muốn nói rằng bạn có thể có một vấn đề đang cố gắng làm theo khái niệm này. Một phần của vấn đề là không biết JVM thực sự là gì, hoặc thứ tự trong đó các hook đóng được gọi là – MadProgrammer

Trả lời

13

Bạn thực sự không nên làm điều này.Từ the Runtime.addShutdownHook specification:

Các máy ảo Java tắt để đáp ứng với hai loại sự kiện:

  • Chương trình thoát bình thường, khi phi daemon chủ đề thoát cuối cùng hoặc khi exit (tương đương, System.exit) phương thức được gọi, hoặc
  • Máy ảo là chấm dứt để phản hồi lại người dùng, chẳng hạn như gõ ^C hoặc sự kiện toàn hệ thống, chẳng hạn như đăng xuất người dùng hoặc tắt hệ thống.

...

móc Shutdown chạy tại một thời điểm nhạy cảm trong vòng đời của một máy ảo và do đó cần được mã hóa việc phòng thủ. Họ nên, đặc biệt, được viết để được thread-an toàn và để tránh deadlocks insofar càng tốt. Họ cũng không nên phụ thuộc một cách mù quáng vào các dịch vụ có thể đã đăng ký móc tắt máy của riêng họ và do đó có thể tự mình trong quá trình đóng cửa. Nỗ lực sử dụng các dịch vụ dựa trên luồng khác chẳng hạn như chủ đề gửi sự kiện AWT, ví dụ, có thể dẫn đến deadlocks.

Móc tắt máy cũng nên hoàn thành công việc của họ một cách nhanh chóng. Khi một chương trình gọi exit, kỳ vọng là máy ảo sẽ nhanh chóng tắt và thoát. Khi máy ảo bị chấm dứt do người dùng đăng xuất hoặc tắt hệ thống, hệ điều hành bên dưới chỉ có thể cho phép một khoảng thời gian cố định để tắt và thoát. Do đó, không thể thực hiện được bất kỳ sự tương tác nào của người dùng hoặc thực hiện một phép tính dài hạn trong một hook tắt máy.

...

Trong trường hợp hiếm hoi máy ảo có thể hủy bỏ, đó là, ngừng chạy mà không cần tắt sạch. Điều này xảy ra khi máy ảo bị chấm dứt bên ngoài, ví dụ với tín hiệu SIGKILL trên Unix hoặc cuộc gọi TerminateProcess trên Microsoft Windows. Máy ảo cũng có thể hủy bỏ nếu một phương thức nguyên bản bị hỏng, ví dụ, làm hỏng cấu trúc dữ liệu nội bộ hoặc cố gắng truy cập bộ nhớ không tồn tại. Nếu máy ảo hủy bỏ thì không có sự bảo đảm nào có thể được thực hiện về việc có hay không bất kỳ móc tắt máy nào sẽ được chạy.

cảnh báo cụ thể ở đây là đề nghị bạn không làm điều này:

  1. "móc Shutdown cũng nên hoàn thành công việc của họ một cách nhanh chóng."

    Dựa vào bất cứ điều gì rằng có thể mất một thời gian để làm công việc của mình, hoặc chặn vô thời hạn trên sử dụng đầu vào như JOptionPane hộp thoại, là không những gì bạn nên làm trong móc tắt máy của bạn.

  2. "Những nỗ lực để sử dụng các dịch vụ dựa trên thread khác như AWT event-văn, ví dụ, có thể dẫn đến sự bế tắc"

    Swing chạy trên đầu trang của AWT, có tiềm ẩn sự kiện văn thread cũng có thể đang trong quá trình tắt.Cố gắng sử dụng Swing hoặc AWT trong khi tắt có thể dẫn đến không chỉ các khóa chết mà còn có thể không hoạt động chút nào, dù sao đi nữa.

  3. "Nếu máy ảo hủy bỏ sau đó không có bảo đảm có thể được thực hiện về việc có hay không bất cứ móc tắt máy sẽ được chạy"

    Có gì đảm bảo người dùng của bạn thậm chí có thể có thể nhận được tin nhắn của bạn, vì móc shutdown chỉ được đảm bảo chạy khi nó thoát bình thường hoặc chấm dứt - không phải khi bị tạm dừng hoặc hủy bỏ.

+0

+1 thêm thông tin cho OP –

+1

+1 nhiều thông tin hay và yêu thích bản tóm tắt – MadProgrammer

+0

Đây là những gì tôi đã hiểu trước đây, hy vọng sẽ có một cách, nhưng tôi cho rằng không –

2
  1. Swing GUI này phải được thực hiện trên Event Dispatch Thread, sau đó

  2. Simple way, nhưng cần hành động người dùng cuối (gần JDialog)

+0

Tôi e là tôi không thấy câu trả lời của bạn có liên quan gì đến câu hỏi gốc. –

+0

@DuncanJones Anh ấy trả lời nó. Câu trả lời của anh ta là về việc ngắt kết nối hook + với một giải pháp có thể ... –

+0

@mKorbel Tôi không thấy tùy chọn đầu tiên sẽ hoạt động như thế nào; Tôi không gọi cho hook tắt máy, nó xảy ra như một sự xuất hiện ngẫu nhiên, tôi chỉ muốn xử lý nó với một cửa sổ popup. Đối với thứ hai, tôi thấy một số tiềm năng trong đó, tuy nhiên, Runtime # exec làm việc khi JVM/máy tính tắt? –

2

Nếu có, nó sẽ không giúp bạn.

Móc tắt được gọi không đồng bộ như một phần của quá trình tắt JVM, do đó hộp thoại "xác nhận" sẽ không thực sự xác nhận bất kỳ điều gì vì bạn không thể tạm dừng hoặc đảo ngược quy trình tắt máy. Việc chờ người dùng đưa ra quyết định không phải là loại hành động mà một cái móc tắt máy có nghĩa là. Một móc tắt trong một chương trình tương tác không có ý nghĩa. Các trường hợp sử dụng thực sự cho móc tắt là:

giải phóng các nguồn lực và dịch vụ dọn khác khi JVM shutsdown

Nó cũng quan trọng cần lưu ý móc đóng cửa sẽ không luôn luôn được chạy, cho xem chi tiết câu trả lời của tôi ở đây: How to shutdown java application correctly from C# one

+0

Mặc dù nó được xử lý không đồng bộ, chủ đề vẫn không phải là daemon và do đó nó vẫn có thể hoạt động ... không phải là bạn nên __ever__ làm điều đó. – oldrinb

+0

@veer true nhưng tôi đoán vấn đề lớn nhất mà OP sẽ phải đối mặt là không phải tất cả các chấm dứt của một ứng dụng sẽ gọi móc tắt máy –

-1

Tôi không chắc chắn về câu hỏi của bạn, nhưng tôi nghĩ rằng không thể chạy hoặc hiển thị cửa sổ bật lên khi JVM tắt. Nó giống như bạn đang cố chạy trong khi chuẩn bị ngủ? Chỉ cần đoán thôi. :)

4

Móc tắt máy được yêu cầu thực thi càng nhanh càng tốt. Điều đó không bao gồm việc chờ người dùng xác nhận một hộp thoại. Trong mọi trường hợp, bạn không bảo đảm rằng chuỗi sự kiện Swing vẫn đang chạy.

Bạn không thể thực hiện việc này.

+0

+1 đẹp "bạn không đảm bảo rằng chuỗi sự kiện Swing vẫn đang chạy" –

Các vấn đề liên quan