为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。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. Leetcode OJ : Compare Version Numbers Python solution

    Total Accepted: 12400 Total Submissions: 83230     Compare two version numbers version1 and version2 ...

  2. HIbernate学习笔记(六) 关系映射之多对多

    六.多对多 - 单向 Ø        一般的设计中,多对多关联映射,需要一个中间表 Ø        Hibernate会自动生成中间表 Ø        Hibernate使用many-to-ma ...

  3. HDU-4627 The Unsolvable Problem 简单数学

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4627 对n除个2,然后考虑下奇偶... //STATUS:C++_AC_15MS_228KB #inc ...

  4. [学姿势]实验室搬砖+node学习

    这周开始进行收尾工作,我当然没有进行核心技术的开发,主要负责的是对web端进行展示上的修修补补,主要包括添加VLC播放器.rtsp视频流以及一些js细节. 1.VLC 全称为Video Lan Cli ...

  5. Sitecore Digital Marketing System, Part 1: Creating personalized, custom content for site visitors(自定义SiteCore中的 Item的Personalize的Condition) -摘自网络

    Sitecore’s Digital Marketing System (DMS) can help you personalize the content your site displays to ...

  6. 第十三章、学习 Shell Scripts 循环 (loop)

    while do done, until do done (不定循环) while [ condition ] <==中括号内的状态就是判断式 do <==do 是回圈的开始! 程序段落 ...

  7. Codeforces Wilbur and Array

    Description Wilbur the pig is tinkering with arrays again. He has the array a1, a2, ..., an initiall ...

  8. ios引导页 设定以及 图片尺寸

      iphone的屏幕尺寸有着几种: iphone 4/4s: 3.5 寸 分辨率:640X960 高宽比 640/960 = 1.5 iphone 5/5c/5s:4 寸 分辨率:640X1136  ...

  9. iOS UDID和UUID详解

    这篇是普及知识来了,纯属消遣时间,有需要的可以遛一遛. UDID的全名为 Unique Device Identifier :设备唯一标识符.从名称上也可以看出,UDID这个东西是和设备有关的,而且是 ...

  10. cocos2d_随手篇1_关于ccTouchBegan的调用

    在新的cocos框架里,旧的调用ccTouchBegan方法被和谐掉了!so! 直接来代码 1 -(void)doSometing{ 2   [[[CCDirector sharedDirector] ...