Java中处理Linux信号量
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。
http://www.cnblogs.com/shijiaqi1066/p/5976361.html
Linux信号量
Linux信号量是一种比较原始的进程通信手段。有很多缺陷,可却是理解操作系统的基础概念。
使用 kill -l 查询机器上所有信号量,不同操作系统上显示的不一样。
Java中处理信号量
通常Java只支持一种信号量的捕获,即使用runtime.addShutdownHook()对退出信号做处理。
Runtime.getRuntime().addShutdownHook(handleThread); //handleThread是信号处理线程。
按照Java标准,Java不支持其他信号的处理,因为这涉及到操作系统,而不是JVM层面的事情。但按照Java一贯的尿性,很多看似没办法的特性都可以通过 sun.misc 包提供的一系列黑魔法来实现。
原则上sun.misc包中的内容不被推荐使用,所以编译器会发出警告。需要添加 @SuppressWarnings("restriction") 来消除警告。
package sjq.signal.java; import sun.misc.Signal;
import sun.misc.SignalHandler; @SuppressWarnings("restriction")
public class SignalTest {
public static void main(String[] args) throws InterruptedException {
// 信号处理实例
MySignalHandler mySignalHandler = new MySignalHandler(); // 注册对指定信号的处理
Signal.handle(new Signal("TERM") ,mySignalHandler); // kill or kill -15
Signal.handle(new Signal("INT"), mySignalHandler); // kill -2 System.out.println("[Thread:"+Thread.currentThread().getName() + "] is sleep" );
while(true) Thread.sleep(1000);
}
} @SuppressWarnings("restriction")
class MySignalHandler implements SignalHandler { @Override
public void handle(Signal signal) { // 信号量名称
String name = signal.getName();
// 信号量数值
int number = signal.getNumber(); // 当前进程名
String currentThreadName = Thread.currentThread().getName(); System.out.println("[Thread:"+currentThreadName + "] receved signal: " + name + " == kill -" + number);
if(name.equals("TERM")){
System.exit(0);
}
} }
在命令行中输入多个kill -2和一个kill后,打印如下内容:
[Thread:main] is sleep
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGINT handler] receved signal: INT == kill -2
[Thread:SIGTERM handler] receved signal: TERM == kill -15
可以看出Java对每个信号都启动一个线程进行处理。注册TERM信号,就启动"SIGTERM handler" 线程。即便主线程被阻塞,信号依然可以得到处理。
由于对信号的处理是多线程的,所以应保证信号处理实例SignalHandler应该是线程安全的。
对于某些信号运行中可能会抛出异常:
java.lang.IllegalArgumentException: Signal already used by VM: USR1
这是因为某些信号可能已经被JVM占用,USR1、USR2,可以考虑用其它信号代替。
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。
http://www.cnblogs.com/shijiaqi1066/p/5976361.html
Java中处理Linux信号量的更多相关文章
- 第90节:Java中的Linux基础
第90节:Java中的Linux基础 linux是装载虚拟机上面的: JDK依赖包: yum install glibc.i686 MYSQL依赖包: yum -y install libaio.so ...
- java中在linux下利用jstack检测死锁
首先,编写一个死锁程序 package deadlock; public class testJstack { final static Object resource_1 = new Object( ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- 如何在java程序中调用linux命令或者shell脚本
转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...
- java中的信号量Semaphore
Semaphore(信号量)充当了操作系统概念下的“信号量”.它提供了“临界区中可用资源信号量”的相同功能.以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果 ...
- Java中Semaphore(信号量)的使用
Semaphore的作用: 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了 ...
- JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构
一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...
- 一篇blog带你了解java中的锁
前言 最近在复习锁这一块,对java中的锁进行整理,本文介绍各种锁,希望给大家带来帮助. Java的锁 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人 ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
随机推荐
- Zabbix探索:网络设备监控1
近期需要大量添加网络设备,为了避免以后在节点100上出现问题,所以特地申请了一台虚拟机,用作代理110. 虽然Zabbix模板中的英文很简单,但是为了同事着想,还是将大部分内容汉化了,避免今后说理解不 ...
- CodeForce---Educational Codeforces Round 3 USB Flash Drives (水题)解题报告
对于这题明显是用贪心算法来解决问题: 下面贴出笔者的代码: #include<cstdio> #include<iostream> #include<algorithm& ...
- Leetcode OJ : Repeated DNA Sequences hash python solution
Total Accepted: 3790 Total Submissions: 21072 All DNA is composed of a series of nucleotides abb ...
- 中断——中断描述符表的定义和初始化(二) (基于3.16-rc4)
上篇博文对中断描述符表(IDT)中异常和非屏蔽中断部分的初始化做了说明,这篇文章将分析外部中断部分的初始化. 在上篇博文中,可以看到,内核在setup_once汇编片段中,对中断和异常部分做了初步的初 ...
- HW7.3
public class Solution { public static void main(String[] args) { char[][] answers = { {'A', 'B', 'A' ...
- poj2152 Fire
好难啊,我弱爆了. 题解看陈启峰的论文... /** * Problem:POJ2152 * Author:Shun Yao * Time:2013.9.2 * Result:Accepted * M ...
- SRM 596 DIV 2
前段时间终于配置好了TopCoder的环境,所以就拿这场的DIV2练习了一下 1. 250pt FoxAndSightseeing 题意 给你n个城市的位置,他们在同一直线上,要求你跳过其中某一个城市 ...
- Spring配置文件的加载,及装载多个beans.xml文件
applicationContext.xml 是spring的全局配置文件,用来控制srping的特性 1 手动加载自定义的beans.xml文件 @Test public void testAut ...
- Java HashMap 核心源码解读
本篇对HashMap实现的源码进行简单的分析. 所使用的HashMap源码的版本信息如下: /* * @(#)HashMap.java 1.73 07/03/13 * * Copyright 2006 ...
- Web- 一些标签样式
网上找来的.有点用 1.只有下划线的文本框:<input style="border:0;border-bottom:1 solid black;background:;"& ...