java 运行多线程轮询时,外部停止轮询
2018-03-30 20:37
465 查看
1,先建一个Map/**
* 创建一个Map用于存放线程id对象集合,主要是用于到达岗亭之后扫码付费,如果人工收费就需要关闭线程,key是停车记录Id,
*/
public static Map<String, String> MAPTHREAD = new HashMap<String,String>();2.建一个线程类继承Runnable/**
* 轮询查询网上支付结果
* @author Administrator
*
*/
@Component
public class PollingSearch implements Runnable{
private String flag;
private ParkingRecord parkingRecord;
// @Autowired
// private OnlinePaymentService onlinePaymentService;
//@Autowired
//private CameraLogic cameraLogic;
@Override
public void run() {
try {
CameraLogic cameraLogic = (CameraLogic) SpringUtil.getObject("cameraLogic");
OnlinePaymentService onlinePaymentService = (OnlinePaymentService) SpringUtil.getObject("onlinePaymentServiceImpl");
while(CommonUtil.MAPTHREAD.get(flag).equals("true")) {
Thread.sleep(5000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setFlag(String flag) {
this.flag = flag;
}
public ParkingRecord getParkingRecord() {
return parkingRecord;
}
public void setParkingRecord(ParkingRecord parkingRecord) {
this.parkingRecord = parkingRecord;
}
public String getFlag() {
return flag;
}spring容器中无法自动注入,所以用这两句代码获取,springUtil可参考我的另一篇文章 spring ioc容器管理 CameraLogic cameraLogic = (CameraLogic) SpringUtil.getObject("cameraLogic");
OnlinePaymentService onlinePaymentService = (OnlinePaymentService) SpringUtil.getObject("onlinePaymentServiceImpl");重要的代码在这while(CommonUtil.MAPTHREAD.get(flag).equals("true")) {上面代码在根据map中判断了是否执行轮询,当为true时才执行
下面开启线程 final String parkRecordId = oldRecord.getId();
final ParkingRecord parkingRecord = oldRecord;
//将账单id放进map中,为了等待支付完成时可以根据停车记录id找到该账单后删除
CommonUtil.PAYMENTRECORDMAP.put(parkRecordId, paymentRecord.getId());
CommonUtil.MAPTHREAD.put(parkRecordId, "true");
PollingSearch pollingSearch = new PollingSearch();
pollingSearch.setParkingRecord(parkingRecord);
pollingSearch.setFlag(parkRecordId);
Thread thread = new Thread(pollingSearch);
thread.start();在需要关闭线程的时候 final String parkingRecordId = parkingRecord.getId();
CommonUtil.MAPTHREAD.put(parkingRecordId,"false");
CommonUtil.MAPTHREAD.remove(parkingRecordId);这样子就可以给各个线程手动关闭了
初学者,不喜勿怪 排版懒得排了
* 创建一个Map用于存放线程id对象集合,主要是用于到达岗亭之后扫码付费,如果人工收费就需要关闭线程,key是停车记录Id,
*/
public static Map<String, String> MAPTHREAD = new HashMap<String,String>();2.建一个线程类继承Runnable/**
* 轮询查询网上支付结果
* @author Administrator
*
*/
@Component
public class PollingSearch implements Runnable{
private String flag;
private ParkingRecord parkingRecord;
// @Autowired
// private OnlinePaymentService onlinePaymentService;
//@Autowired
//private CameraLogic cameraLogic;
@Override
public void run() {
try {
CameraLogic cameraLogic = (CameraLogic) SpringUtil.getObject("cameraLogic");
OnlinePaymentService onlinePaymentService = (OnlinePaymentService) SpringUtil.getObject("onlinePaymentServiceImpl");
while(CommonUtil.MAPTHREAD.get(flag).equals("true")) {
Thread.sleep(5000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setFlag(String flag) {
this.flag = flag;
}
public ParkingRecord getParkingRecord() {
return parkingRecord;
}
public void setParkingRecord(ParkingRecord parkingRecord) {
this.parkingRecord = parkingRecord;
}
public String getFlag() {
return flag;
}spring容器中无法自动注入,所以用这两句代码获取,springUtil可参考我的另一篇文章 spring ioc容器管理 CameraLogic cameraLogic = (CameraLogic) SpringUtil.getObject("cameraLogic");
OnlinePaymentService onlinePaymentService = (OnlinePaymentService) SpringUtil.getObject("onlinePaymentServiceImpl");重要的代码在这while(CommonUtil.MAPTHREAD.get(flag).equals("true")) {上面代码在根据map中判断了是否执行轮询,当为true时才执行
下面开启线程 final String parkRecordId = oldRecord.getId();
final ParkingRecord parkingRecord = oldRecord;
//将账单id放进map中,为了等待支付完成时可以根据停车记录id找到该账单后删除
CommonUtil.PAYMENTRECORDMAP.put(parkRecordId, paymentRecord.getId());
CommonUtil.MAPTHREAD.put(parkRecordId, "true");
PollingSearch pollingSearch = new PollingSearch();
pollingSearch.setParkingRecord(parkingRecord);
pollingSearch.setFlag(parkRecordId);
Thread thread = new Thread(pollingSearch);
thread.start();在需要关闭线程的时候 final String parkingRecordId = parkingRecord.getId();
CommonUtil.MAPTHREAD.put(parkingRecordId,"false");
CommonUtil.MAPTHREAD.remove(parkingRecordId);这样子就可以给各个线程手动关闭了
初学者,不喜勿怪 排版懒得排了
相关文章推荐
- JAVA多线程开发——线程的创建与运行
- 二、java多线程编程核心技术之(笔记)——如何停止线程?
- java8常用的函数,以及lamda表达式有非运行异常能否在外部捕获
- cmd运行javac 报告javac不是内部或外部命令,运行java、java-version正常
- Java多线程之停止线程
- Tomcat报java.lang.OutOfMemoryError: Java heap space错误停止运行如何解决
- Java运行外部程序-_-!...
- JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题
- java运行外部程序
- java多线程 ---- 停止线程
- win10系统"javac"不是内部或外部命令,也不是可运行的程序 或批处理文件。
- Java多线程(五)停止线程 在沉睡中停止线程
- 27、Java入门—多线程之线程的正确停止
- java、java -version能正常运行、但javac不是内部或外部命令,有可能是变量位置问题!
- 如何停止一个正在运行的java线程?
- java多线程程序休眠、暂停、停止
- java 带有包名编译并运行,附带外部依赖jar包运行
- 解决项目运行出现Java Platform SE binary已停止运行
- Java运行外部程序-_-!...
- Java中使用Runtime和Process类运行外部程序