package com.soft.transform.service.thread;
import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.sunline.common.config.DefaultConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
import java.util.concurrent.TimeUnit;
/**
* Created by CaiJianbo on 2016/6/18 13:58.
* sunline
*/
@Component
public class MarketJobDaemon extends Thread {
private static Logger logger = LoggerFactory.getLogger(MarketJobDaemon.class);
private Vector<MarketJobInfo> workers = new Vector<>();
private Vector<MarketJobInfo> updatedWorkers = new Vector<>();
@Autowired
private PhTransCodingThread phTransCodingThread;
@Autowired
private PhTsPersistenceThread phTsPersistenceThread;
@Autowired
private PhTsHisPersistenceThread phTsHisPersistenceThread;
@Autowired
private TsMinutePersistenceThread tsMinutePersistenceThread;
@Autowired
private TsFiveMinutePersistenceThread tsFiveMinutePersistenceThread;
@Resource
DefaultConfig defaultConfig;
private long lastLogTime;
@PostConstruct
private void initJobs() {
workers.add(new MarketJobInfo().setJob(phTransCodingThread)
.setJobName(phTransCodingThread.getClass().getSimpleName()));
workers.add(new MarketJobInfo().setJob(phTsPersistenceThread)
.setJobName(phTsPersistenceThread.getClass().getSimpleName()));
workers.add(new MarketJobInfo().setJob(phTsHisPersistenceThread)
.setJobName(phTsHisPersistenceThread.getClass().getSimpleName()));
workers.add(new MarketJobInfo().setJob(tsMinutePersistenceThread)
.setJobName(tsMinutePersistenceThread.getClass().getSimpleName()));
workers.add(new MarketJobInfo().setJob(tsFiveMinutePersistenceThread)
.setJobName(tsFiveMinutePersistenceThread.getClass().getSimpleName()));
}
@Override
public void run() {
if (CollectionUtils.isNotEmpty(workers)) {
while (true) {
try {
long dateTime = new Date().getTime();
Iterator<MarketJobInfo> iterator = workers.iterator();
MarketJobInfo jobInfo;
BaseMarketThread job;
Thread workThread;
while (iterator.hasNext()) {
jobInfo = iterator.next();
workThread = jobInfo.getWorkThread();
job = jobInfo.getJob();
synchronized (jobInfo) {
if (job.isRunnable(dateTime)) {
if (!workThread.isAlive()) {
if (workThread.getState() == State.NEW) {
jobInfo.startJob(Thread.currentThread());
logger.info("启动线程:" + jobInfo.getJobName());
} else if (workThread.getState() == State.WAITING) {
synchronized (workThread) {
workThread.notify();
}
logger.info("启动线程:" + jobInfo.getJobName());
} else if (workThread.getState() == State.TERMINATED) {
workThread = jobInfo.updateWorkThread();
jobInfo.startJob(Thread.currentThread());
iterator.remove();
updatedWorkers.add(jobInfo);
logger.info("启动线程:" + jobInfo.getJobName());
}
}
} else {
if (workThread.isAlive()) {
job.isInterrupt = true;
synchronized (workThread) {
workThread.interrupt();
}
logger.info("关闭线程:" + jobInfo.getJobName());
}
}
}
}
if (Math.abs(dateTime - lastLogTime) / (1000 * 60) >= 1) {
new Thread(new Runnable() {
@Override
public void run() {
logWorkState();
}
}).start();
}
if (CollectionUtils.isNotEmpty(updatedWorkers)) {
workers.addAll(updatedWorkers);
updatedWorkers.clear();
}
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
logger.error("线程异常。", e);
}
}
}
}
public void logWorkState() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("线程状态:{");
for (MarketJobInfo jobInfo : workers) {
stringBuilder.append("\"").append(jobInfo.getJobName()).append("\"").append(":").append("\"")
.append(jobInfo.getWorkThread().getState()).append("\"").append(",");
}
stringBuilder.append("}");
logger.info(stringBuilder.toString());
lastLogTime = new Date().getTime();
}
public synchronized void StopOtherThread(Set<String> exceptJob) {
if (exceptJob == null) {
exceptJob = new HashSet<>();
}
Thread thread;
for (MarketJobInfo worker : workers) {
if (!exceptJob.contains(worker.getJobName())) {
thread = worker.getWorkThread();
if (!thread.isInterrupted()) {
worker.getJob().isInterrupt = true;
thread.interrupt();
}
}
}
}
}
相关推荐
本示例“C#多线程Demo”着重讲解了如何利用`System.Threading.Tasks.Parallel`类来实现并行处理。`Parallel`类是.NET Framework 4.0引入的新特性,它属于`System.Threading.Tasks`命名空间,主要用于简化多线程编程...
这个"C++11多线程demo"旨在帮助开发者了解和实践C++11中的多线程编程。在本文中,我们将深入探讨C++11中的多线程特性、互斥量的概念以及如何在Ubuntu系统上编译C++11代码。 一、C++11多线程简介 在C++11之前,多...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
综上所述,"C++多线程demo"可能展示了如何在C++中创建、管理和同步线程,以及如何处理多线程编程中常见的挑战。通过学习这个示例,开发者可以更好地理解和应用C++的多线程特性,以提升其软件的并发性能和响应能力。
本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...
本篇文章将通过分析“易语言多线程demo.rar”中的示例,深入探讨易语言中的多线程原理及其应用。 首先,我们需要理解多线程的基本概念。在单线程环境中,程序的执行是顺序进行的,而多线程则允许多个任务同时执行,...
这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解和实践多线程的基本操作。我们将深入探讨其中涉及的知识点。 1. **线程创建**: 在大多数编程语言中,创建线程主要有两种方式:继承Thread...
在这个“Delphi多线程Demo”中,我们将探讨如何在Delphi中创建和管理线程,以及如何实现在线程中定时刷新任务,以保持用户界面的响应性。 首先,我们需要理解多线程的基本概念。在单线程程序中,所有任务都在同一个...
本文将深入探讨“iOS多线程Demo”所体现的核心知识点,并结合实际应用进行详细阐述。 首先,我们要了解多线程的概念。在单线程程序中,所有的任务都是顺序执行的,而在多线程环境中,可以同时处理多个任务,从而...
本项目"多线程demo/java多线程练习"旨在通过实际操作来深入理解和掌握多线程技术,同时模拟数据库操作,这在现代应用程序开发中至关重要。 1. **线程基础** - **创建线程**:Java提供了两种创建线程的方式,分别是...
这个“异步多线程Demo”很可能是为了帮助学习者理解并实践多线程编程而提供的一个实例。 1. **线程定义**:线程是程序执行的最小单元,每个线程都有自己的程序计数器、系统栈和局部变量。在单个进程中,可以有多个...
在描述中提到的"简单的多线程DEMO"很可能包含了以下关键知识点: 1. **线程基础**:线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。多线程允许程序同时执行多个不同的任务,提高资源利用率...
"untiy 多线程demo"是一个展示如何在Unity中实现多线程的实例,它包括了封装的协程(Coroutine)和名为Loom.cs的文件,同时提到了AssetStore上的Loom V1.6插件。 1. **Unity的单线程限制**:Unity引擎默认使用单...
Spring Boot 多线程 Demo Spring Boot 中使用多线程的方式有很多种,最简单的方式就是使用 @Async 注解来实现。下面我们将详细介绍如何使用 @Async 注解来实现多线程编程。 多线程前言 在 Java 中,多线程编程是...
这个"linux多线程demo"示例可能是一个用于教学或实践的项目,通过CMake构建系统进行编译,适用于嵌入式环境,比如ARM架构设备。让我们深入探讨一下多线程、CMake以及在嵌入式Linux中的应用。 **多线程** 多线程允许...
总结来说,"MFC c++ vs2005 多线程 demo"是一个展示如何在C++环境中利用MFC创建并管理多线程的应用程序,特别是如何在多线程中处理并发任务和同步问题。通过学习这个示例,开发者可以更好地理解和应用多线程技术,以...
本文将深入探讨“多线程Demo”所涉及的知识点,帮助你理解和掌握多线程的基本概念、实现方式以及常见应用场景。 一、多线程基础 1. **线程定义**:线程是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程...
综上所述,"MFCACE多线程demo"示例将演示如何在MFC应用中有效地利用ACE库实现多线程,以及如何配置项目属性以确保编译和链接成功。通过这种方式,开发者可以充分利用ACE的并发优势,同时保持MFC的易用性和Windows...