2011-11-22 33 views
7

Tôi có một chương trình bằng Java (với gui xoay) và tôi chỉ muốn 1 ví dụ tồn tại. Nếu nó cố mở một thể hiện khác của chương trình, tôi muốn bản sao hiện tại được đưa lên nền trước.kiểm tra chương trình java một ví dụ

Làm cách nào để thực hiện việc này?

Xin cảm ơn trước.

+6

http://stackoverflow.com/questions/2528844/only-one-swing-frame-window-opened-at-time – onurbaysan

+0

@mKorbel không cần đăng bất kỳ mã nào, câu hỏi rõ ràng và tự chứa. Câu trả lời của Judas Imam là hoàn hảo. – alf

+0

Các cách khác để triển khai ứng dụng ví dụ đơn lẻ: http://stackoverflow.com/questions/177189/how-to-implement-a-single-instance-java-application – ozhan

Trả lời

4

Khởi chạy ứng dụng bằng cách sử dụng Java Web Start và triển khai SingleInstanceService của JNLP API. Đây là demo. of the SingleInstanceService.

Nếu nó cố gắng mở một phiên bản chương trình khác, tôi muốn bản sao hiện tại được đưa vào nền trước.

Móc lên theo phương pháp newActivation(String[]) của SingleInstanceListener. Nó sẽ được chuyển qua bất kỳ đối số nào đã được cung cấp cho lần ra mắt mới. Ví dụ hiện tại được quyết định phải làm gì với args mới (ví dụ: thay đổi tệp, thêm tab mới, bỏ qua ..)

-3

Pattern singletone:

class SingleInstance { 
private static SingleInstance instance; 

public SingleInstance getInstance() { 
    if (instance==null) 
     instance = new SingleInstance(); 
    return instance; 
} 

private SingleInstance() { 
//construct it! 
} 
} 
+2

Sử dụng một singleton trong một ứng dụng không ngăn cản nhiều phiên bản của ứng dụng (ví dụ: nhiều phiên bản JVM). –

+0

Điều đó chỉ giúp trong một trình nạp lớp; OP muốn một cái gì đó giống như "chỉ có một ví dụ trên máy tính" – alf

0

Trong C# bạn thường tạo ra một Mutex tại Application bắt đầu. Nếu bạn không thể tạo/lấy nó, một thể hiện khác của ứng dụng đang chạy. Thật không may tôi không chắc chắn 100% nếu điều này hoạt động giống nhau trong Java hoặc cú pháp chính xác là gì.

Hy vọng điều này sẽ hữu ích.

+5

(Un) may mắn thay, Java mutexes không được chia sẻ giữa các quá trình. – alf

+1

@alf Cảm ơn bạn đã biết thông tin - học cái gì mới mỗi ngày ... Điều này làm cho câu trả lời của tôi vô dụng, nhưng có thể có một nhà phát triển C# khác cũng không biết. –

+0

Không nhất thiết vô dụng. Ý tưởng là ở đó. Bạn chỉ cần tìm một cách khác để thực hiện mutex. –

2

Không có ví dụ nào trong Java, nhưng bạn có thể tạo tệp pid trong thư mục tạm thời (hoặc/var/run). (Và làm cho nó File.deleteOnExit() để làm sạch nó anyway trên lối ra)

Để đưa cửa sổ hiện tại lên trên, bạn có thể tự mình thông báo cho chương trình, đặt tên là pipe, unix socket hoặc java remote method call, v.v ... & bẩn là viết một tệp nhỏ, nói $TEMP/foobar-app.bring-to-top và chương trình nên thăm dò định kỳ tệp nhỏ này, nếu có tồn tại, hãy đưa cửa sổ lên trên và xóa tệp nhỏ này.

Tôi đoán Java không thể xử lý tín hiệu, tức là, kill -HUP PID có thể không hoạt động đối với các ứng dụng Java. Ngay cả khi nó có thể, không phải mọi hệ điều hành đều có tín hiệu.

3

Bạn có thể thực hiện bằng cách sử dụng ShutDownHook và tệp khóa, xem đơn giản example này.

Tôi nghĩ rằng đó là cách đơn giản nhất ...

+0

Tôi đồng ý. Đây có lẽ là cách tiếp cận đơn giản nhất để triển khai. Đây là những gì tôi đã sử dụng. Có một mẹo nhỏ khi khởi động để làm tròn lỗi xóa tệp trên Windows. –

1

Tôi đã làm điều này một lần với một Socket và một ServerSocket:


Đầu tiên, khi bạn bắt đầu ứng dụng của bạn, làm cho một ServerSocket nghe trên một số cổng, ví dụ: 4004. Bí quyết là để kiểm tra xem nó ném một IOException. Nếu có, có một ứng dụng khác đang chạy hoặc cổng được sử dụng bởi một ứng dụng khác (check this list for commonly used ports; Lưu ý rằng các cổng TCP và UDP không chặn lẫn nhau), nếu không bạn có thể tiếp tục khởi động ứng dụng của mình. Nếu một cá thể hiện đang chạy, bạn có thể muốn thông báo bằng cách kết nối một TCP Socket (đảm bảo rằng kết nối của bạn đến; UDP không).

Dưới đây là một ví dụ:

ServerSocket ss = null; 
try { 
    ss = new ServerSocket(4004); 
} catch (IOException ex0) { 
    // Port either occupied by your application or a foreign one 
    // -> Connect 
    Socket s = null; 
    try { 
     s = new Socket(); 
    } catch (Exception ex1) { 
     // Something went wrong 
    } 
    if (s != null) { 
     // Send some singnal 
    } 
} 
if (ss == null) { 
    // Close or do something else 
} 

(tôi đã viết này ra khỏi bộ nhớ của tôi, vì vậy một số điều có thể sai hoặc có thể được thực hiện tốt hơn).

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