为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。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信号量的更多相关文章

  1. 第90节:Java中的Linux基础

    第90节:Java中的Linux基础 linux是装载虚拟机上面的: JDK依赖包: yum install glibc.i686 MYSQL依赖包: yum -y install libaio.so ...

  2. java中在linux下利用jstack检测死锁

    首先,编写一个死锁程序 package deadlock; public class testJstack { final static Object resource_1 = new Object( ...

  3. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  4. 如何在java程序中调用linux命令或者shell脚本

    转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...

  5. java中的信号量Semaphore

    Semaphore(信号量)充当了操作系统概念下的“信号量”.它提供了“临界区中可用资源信号量”的相同功能.以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果 ...

  6. Java中Semaphore(信号量)的使用

    Semaphore的作用: 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了 ...

  7. JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...

  8. 一篇blog带你了解java中的锁

    前言 最近在复习锁这一块,对java中的锁进行整理,本文介绍各种锁,希望给大家带来帮助. Java的锁 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人 ...

  9. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

随机推荐

  1. 仿酷狗音乐播放器开发日志三——修复CEditUI的bug2

    无意中发现了CEditUI控件的另一个bug,当我给播放器的搜索栏获取焦点时,这时再改变窗体大小,原本搜索栏应该对应着也改变大小,却发现CEditUI内嵌的edit控件没有跟着改变(如下图),跟着调试 ...

  2. FZU 2127 养鸡场

     Problem Description Jason买来了n米长的竹篱笆,打算将n米长的竹篱笆全部用来围成一个三角形的养鸡场.为方便起见,养鸡场三条边的长度都为正整数.同时,他想让自己的养鸡场看起来更 ...

  3. class0513(html基础加强)

    内容:HTML.CSS 目标:掌握手写HTML实现一般难度的Web页面的能力(如网站注册表单),为ASP.Net学习打基础.坚持手写HTML,可视化设计只是一种自学的手段. 参考书:张孝祥<Ja ...

  4. bzoj 3197 [Sdoi2013]assassin(Hash+DP+KM)

    Description Input Output Sample Input 4 1 2 2 3 3 4 0 0 1 1 1 0 0 0 Sample Output 1 HINT [思路] Hash,D ...

  5. ACM2040

    关于亲和数的详细解释如下: http://www.kepu.net.cn/gb/basic/szsx/8/8_83/8_83_1004.htm /* 亲和数 时间限制:2000/1000 MS(JAV ...

  6. matlab 函数说明—ordfilt2

    今天看harris角点实现的源码,在某一个版本中看到了这个函数,不是很理解,doc ordfilt2之后还是不清楚,终于在matlab论坛上搞清楚了ordfilt2的功能.   中文理解函数名就是顺序 ...

  7. Harris 角点检测

    一 .Motivation 对于做图像处理的人来说,Harris角点检测肯定听过,1988年发表的文章"A combined corner and edge detector"描述 ...

  8. Read Asia Embedded fell

    first and foremost, 很久没写了,心痒了,手贱了,于是乎在这一刻心静时,积攒的思绪开始回放了,惊世Copy-on-write之文随之面世了; 臭毛孩子拉的 屎 特臭,小毛孩子前途黯淡 ...

  9. 创建本地CM 离线服务器

    一.包管理工具及CentOS的yum 1.包管理工具如何发现可以用的包 包管理工具依赖一系列软件源,工具下载源的信息存储在配置文件中,其位置随某包管理工具不同而变化 使用yum的RedHat/Cent ...

  10. Django中的Model(操作表)

    Model 操作表 一.基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = m ...