Java程序的安全退出

Java程序的安全退出

一、原理

Signal实例表示一个信号量实例
将Signal实例注册到SignalHandler中实现对该信号量的监听
当监听到信号量,就会回调handle方法

特别注意:安全退出是通过监听信号量回调方法运行,并不是让程序退出。而其他方法是程序主动关闭,会停止其他线程运行shudownhook线程进行扫尾关闭

二、它和关闭钩子的区别

1、关闭钩子:会终止main线程让整个程序停下来后执行shutdownHook线程进行扫尾工作、
2、监听信号量:系统发送信号量以后,会先被Java程序中的监听程序线程捕获信号量,不影响main线程的继续运行,可以在其中调用System.exit(0)来关闭程序,这个时候就会正常关闭程序,运行shutdownhook线程

三、例子

public class ShutdownTest {
    public static void main(String[] args) {
        System.out.println("Shutdown Test");

        Signal sg = new Signal("TERM"); // kill -15 pid
        // 监听信号量
        //将sg这个信号量实例注册到一个SignalHandler实例中
        Signal.handle(sg, new SignalHandler() {
        //收到指定信号量就回调handle()方法
            @Override
            public void handle(Signal signal) {
                System.out.println("signal handle: " + signal.getName());
                System.exit(0);
            }
        });
        // 注册关闭钩子
        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run() {
                // 在关闭钩子中执行收尾工作
                // 注意事项:
                // 1.在这里执行的动作不能耗时太久
                // 2.不能在这里再执行注册,移除关闭钩子的操作
                // 3 不能在这里调用System.exit()
                System.out.println("do shutdown hook");
            }
        });

        mockWork();

        System.out.println("Done.");
        System.exit(0);
    }

    // 模拟进程正在运行
    private static void mockWork() {
        //mockRuntimeException();
        //mockOOM();
        try {
            Thread.sleep(120 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
    }

    // 模拟在应用中抛出RuntimeException时会调用注册钩子
    private static void mockRuntimeException() {
        throw new RuntimeException("This is a mock runtime ex");
    }

    // 模拟应用运行出现OOM时会调用注册钩子
    // -xms10m -xmx10m
    private static void mockOOM() {
        List list = new ArrayList();
        for(int i = 0; i < 1000000; i++) {
            list.add(new Object());
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一名AI语言模型,无法编写完整的程序。但是,我可以提供一些基本思路和实现方法: 1. 首先需要定义图书类(Book),包括书名、作者、ISBN、出版社、出版日期、价格等属性。 2. 定义图书管理类(BookManager),包括添加图书、删除图书、查询图书、借出图书、归还图书等操作方法。 3. 使用集合(如ArrayList)存储所有图书信息,并提供相应的操作方法。 4. 实现图形界面(GUI)以便用户进行操作。 5. 将数据保存到文件中,以便下次启动程序时读取。 下面是一个简单的示例代码: ``` import java.util.ArrayList; import java.util.Scanner; public class Book { private String title; private String author; private String isbn; private String publisher; private String publishDate; private double price; public Book(String title, String author, String isbn, String publisher, String publishDate, double price) { this.title = title; this.author = author; this.isbn = isbn; this.publisher = publisher; this.publishDate = publishDate; this.price = price; } public String getTitle() { return title; } public String getAuthor() { return author; } public String getIsbn() { return isbn; } public String getPublisher() { return publisher; } public String getPublishDate() { return publishDate; } public double getPrice() { return price; } } public class BookManager { private ArrayList<Book> books; public BookManager() { books = new ArrayList<Book>(); } public void addBook(Book book) { books.add(book); } public void removeBook(Book book) { books.remove(book); } public ArrayList<Book> searchBook(String keyword) { ArrayList<Book> result = new ArrayList<Book>(); for (Book book : books) { if (book.getTitle().contains(keyword) || book.getAuthor().contains(keyword) || book.getIsbn().contains(keyword)) { result.add(book); } } return result; } public void borrowBook(Book book) { // TODO: 实现借出图书操作 } public void returnBook(Book book) { // TODO: 实现归还图书操作 } } public class Main { private static BookManager bookManager; private static Scanner scanner; public static void main(String[] args) { bookManager = new BookManager(); scanner = new Scanner(System.in); while (true) { System.out.println("请选择操作:"); System.out.println("1. 添加图书"); System.out.println("2. 删除图书"); System.out.println("3. 查询图书"); System.out.println("4. 借出图书"); System.out.println("5. 归还图书"); System.out.println("0. 退出"); int choice = scanner.nextInt(); switch (choice) { case 0: System.exit(0); break; case 1: addBook(); break; case 2: removeBook(); break; case 3: searchBook(); break; case 4: borrowBook(); break; case 5: returnBook(); break; default: System.out.println("无效的选择,请重新输入"); break; } } } private static void addBook() { System.out.println("请输入书名:"); String title = scanner.next(); System.out.println("请输入作者:"); String author = scanner.next(); System.out.println("请输入ISBN:"); String isbn = scanner.next(); System.out.println("请输入出版社:"); String publisher = scanner.next(); System.out.println("请输入出版日期:"); String publishDate = scanner.next(); System.out.println("请输入价格:"); double price = scanner.nextDouble(); Book book = new Book(title, author, isbn, publisher, publishDate, price); bookManager.addBook(book); System.out.println("添加成功"); } private static void removeBook() { // TODO: 实现删除图书操作 } private static void searchBook() { System.out.println("请输入关键字:"); String keyword = scanner.next(); ArrayList<Book> result = bookManager.searchBook(keyword); if (result.size() == 0) { System.out.println("未找到相关图书"); } else { System.out.println("查询结果:"); for (Book book : result) { System.out.println(book.getTitle() + " " + book.getAuthor() + " " + book.getIsbn() + " " + book.getPublisher() + " " + book.getPublishDate() + " " + book.getPrice()); } } } private static void borrowBook() { // TODO: 实现借出图书操作 } private static void returnBook() { // TODO: 实现归还图书操作 } } ``` 上述代码只是一个简单的示例,实际开发中还需要考虑数据验证、异常处理、多线程等问题,以保证程序的稳定性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值