was控制台无法停止应用
问题描述:
was控制台无法停止应用,只能通过停止server的方式停止;
代码实现:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.concurrent.LinkedBlockingQueue; /**
* @className MessageReceiver
* @Desc 消息接收处理
* @Author HZ
* @Date 2019/11/25 9:39
* @Version 1.0
*/
public class MessageReceiver implements Runnable{ private final static Logger LOGGER = LoggerFactory.getLogger(MessageReceiver.class); /**
* 通信消息队列
* */
private LinkedBlockingQueue<String> messageQueue = new LinkedBlockingQueue<>(); /**
* 线程名
* */
private final static String threadName = "MessageReceiver"; /**
* 运行标志
* */
private volatile boolean isRunning = true; /**
* 线程
* */
private Thread messageQueueThread; /**
* 锁 用作休眠与唤醒
* */
private Object lock = new Object(); /**
* @title
* @Description 初始化
* @Author HZ
* @Param
* @Return
* @Date: 2019/11/25 10:59
*/
public void init(){
this.messageQueueThread = new Thread(this, threadName);
this.messageQueueThread.start();
} /**
* @title destory
* @Description 停止时销毁
* lock.notifyAll();先唤醒messageQueueThread线程!!!
* this.messageQueueThread.join();等待messageQueueThread线程执行完
* @Author HZ
* @Param []
* @Return void
* @Date: 2019/11/25 10:59
*/
public void destory(){
this.isRunning = false; synchronized (lock) {
lock.notifyAll();
LOGGER.info("强制唤醒messageQueueThread");
} if (this.messageQueueThread != null) {
try {
this.messageQueueThread.join();
} catch (InterruptedException e) {
LOGGER.info("线程关闭失败...错误信息={}", e);
}
}
LOGGER.info("destroy MessageDatacommReceiver success");
} /**
* @title pushIntoQueue
* @Description 把对象放入队列
* @Author HZ
* @Param [str]
* @Return void
* @Date: 2019/11/25 11:01
*/
public void pushIntoQueue(String str){
try {
synchronized (lock) {
this.messageQueue.put(str);
LOGGER.debug("开始唤醒messageQueueThread线程");
lock.notifyAll();
}
} catch (InterruptedException e) {
LOGGER.error("把对象放入队列...错误信息={}", e);
}
} /**
* @title run
* @Description 线程主方法
* @Author HZ
* @Param []
* @Return void
* @Date: 2019/11/25 11:01
*/
@Override
public void run(){
while(this.isRunning){
try {
synchronized (lock) {
if(this.messageQueue.isEmpty()){
lock.wait();
LOGGER.debug("messageQueueThread线程被唤醒");
}else{
//TODO 业务方法
}
}
}catch (Exception e) {
// 捕获异常,防止线程死掉
LOGGER.error("messageQueueThread发生未预计的异常", e);
}
}
}
}
功能描述:
实例化MessageReceiver类时调用init()方法,创建并启动一个线程messageQueueThread
messageQueueThread线程的停止依靠运行标记isRunning控制
生产者通过调用pushIntoQueue方法将待处理事件放入到阻塞队列messageQueue, 同时调用notifyAll通知messageQueueThread取获取数据
messageQueueThread循环从阻塞队列messageQueue中获取数据,没有获取到值则调用wait方法阻塞 MessageReceiver对象销毁时调用destory方法
问题原因:
destory()中没有调用lock.notifyAll();这段代码
导致调用this.messageQueueThread.join();方法时messageQueueThread一直阻塞没有执行,该对象也就无法销毁,资源无法释放
synchronized (lock) {
lock.notifyAll();
LOGGER.info("强制唤醒messageQueueThread");
}
参考文档:
https://www.cnblogs.com/yanze/p/10032363.html
https://blog.csdn.net/jiangguilong2000/article/details/11617529
was控制台无法停止应用的更多相关文章
- WEBLOGIC启动后,重启后控制台进入缓慢、延迟,探查WEBLOGIC
本文说的是解决过程,可直接点击本行略过探查内容,跳到最后的解决办法!! 现象: 1.WEBLOGIC安装在 CENTOSopenSUSE 等LINUX或者UNIX机器上,无论是虚拟机或者PC或者服务器 ...
- WCF学习笔记1--发布使用配置文件的服务
关于WCF的入门网上资料很多,可以参考蒋金楠老师的博客http://www.cnblogs.com/artech/archive/2007/02/26/656901.html,我是从这篇博客开始学习的 ...
- [置顶] Weblogic节点管理
配置节点管理之后能方便管理,可以在控制台启动停止被管服务器,一般配置步骤:创建受管服务器,创建machine,屏蔽SSL主机名验证,修改nodemanager.properties,启动nodeman ...
- ubuntu上的mysql数据库双机备份设置
配置环境: myslq 5.5.3 + ubuntu server 12.04 一.配置MySQL主服务器(192.168.0.1) 1.增加一个账号专门用于同步 1 mysql>grant r ...
- Maven注意事项
Maven好处: 1.依赖管理:对jar包统一管理 2.项目构建:项目编码完成后,对项目进行编译.测试.打包.部署,实现项目一键发布1.配置环境变量 注意:maven工具必须有jdk环境.并且: ...
- zookeeper初探
安装三台linux虚拟机,安装好java环境,并配置好网络以及host文件,分别改好hostname为node0.node1.node2 上传下载好的zookeeper文件到node0的/usr/lo ...
- vue-cli webpack 全局引用jquery
一.初始化项目 首先,执行vue init webpack F:\ZhaoblTFS\Zeroes\Document\代码示例\vue-cli-webpack-jquery>vue init w ...
- weblogic——服务器搭建与配置
本次操作的内容:weblogic服务器搭建与配置服务 本次操作是主要围绕如何搭建weblogic服务器及配置服务,总共有两大步骤,可划分为六个小步骤: 选取已有环境,准备weblogic压缩包 安装w ...
- weblogic重启脚本
客户要求每周weblogic重启,每台机器上有多个weblogic实例,开始准备单个服务器实例做成sysv风格的脚本,但是实例较多,于是在满足需求和自动化重启的情况下,多个服务器实例的重启放在了一起, ...
随机推荐
- patch工具的使用
1. 最简用法 patch -p1 < jello.patch
- keras损失函数
keras文档: http://keras.io/objectives/ mean_squared_error / mse 均方误差,常用的目标函数,公式为((y_pred-y_true)**2) ...
- Canvas的flag具体的含义
示例代码: package com.loaderman.customviewdemo; import android.content.Context; import android.graphics. ...
- BIM IFC算量
1.基础工程:挖槽.垫层.基础底板.基础墙.地圈梁.暖气沟.回填土等:2.主体工程:梁.板.柱.墙等:3.屋顶工程:挑檐.女儿墙.保温.防水.压顶等:4.装修工程:外墙抹灰.墙裙.门窗套.内墙抹灰.粉 ...
- Golang 项目 GOPATH 总结
查看GOPATH go env 项目里执行:go get github/winyh/XXX 命令时, 包会下载到 GOPATH第一个目录下的src文件夹 项目里引入依赖的时候会自动到GOPATH里 ...
- Laravel 项目开发环境配置
1.首先安装Laravel 依赖管理包工具 Composer (前提是本地装好了PHP php -v) php -r "copy('https://install.phpcomposer. ...
- JsonSchema用法
JsonSchema用法 简介 JSON Schema是基于JSON格式,用于定义JSON数据结构以及校验JSON数据内容.JSON Schema官网地址:http://json-schema.org ...
- .Net Core 常用开发工具
组件名 描述 可选版本 推荐版本 Visual Studio Community 社区免费版 For Visual Studio 2017 For Visual Studio 2019 Visual ...
- Redcon:快速的Redis服务器Go实现
Fast Redis compatible server framework for Go Redcon is a custom Redis server framework for Go that ...
- myeclipse安装activiti-designer
将压缩包中的features和plugins放到dropins下,然后重启myeclipse activiti-designer下载地址: 链接:https://pan.baidu.com/s/19u ...