`
taiwei.peng
  • 浏览: 233970 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多线程demo

阅读更多

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

    本示例“C#多线程Demo”着重讲解了如何利用`System.Threading.Tasks.Parallel`类来实现并行处理。`Parallel`类是.NET Framework 4.0引入的新特性,它属于`System.Threading.Tasks`命名空间,主要用于简化多线程编程...

    C++11多线程demo

    这个"C++11多线程demo"旨在帮助开发者了解和实践C++11中的多线程编程。在本文中,我们将深入探讨C++11中的多线程特性、互斥量的概念以及如何在Ubuntu系统上编译C++11代码。 一、C++11多线程简介 在C++11之前,多...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    C++多线程demo

    综上所述,"C++多线程demo"可能展示了如何在C++中创建、管理和同步线程,以及如何处理多线程编程中常见的挑战。通过学习这个示例,开发者可以更好地理解和应用C++的多线程特性,以提升其软件的并发性能和响应能力。

    android多线程demo(很清晰很详细)

    本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...

    易语言多线程demo.rar

    本篇文章将通过分析“易语言多线程demo.rar”中的示例,深入探讨易语言中的多线程原理及其应用。 首先,我们需要理解多线程的基本概念。在单线程环境中,程序的执行是顺序进行的,而多线程则允许多个任务同时执行,...

    多线程demo程序-轻松掌握多线程技术

    这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解和实践多线程的基本操作。我们将深入探讨其中涉及的知识点。 1. **线程创建**: 在大多数编程语言中,创建线程主要有两种方式:继承Thread...

    Delphi多线程Demo

    在这个“Delphi多线程Demo”中,我们将探讨如何在Delphi中创建和管理线程,以及如何实现在线程中定时刷新任务,以保持用户界面的响应性。 首先,我们需要理解多线程的基本概念。在单线程程序中,所有任务都在同一个...

    iOS多线程Demo

    本文将深入探讨“iOS多线程Demo”所体现的核心知识点,并结合实际应用进行详细阐述。 首先,我们要了解多线程的概念。在单线程程序中,所有的任务都是顺序执行的,而在多线程环境中,可以同时处理多个任务,从而...

    多线程demo/java多线程练习

    本项目"多线程demo/java多线程练习"旨在通过实际操作来深入理解和掌握多线程技术,同时模拟数据库操作,这在现代应用程序开发中至关重要。 1. **线程基础** - **创建线程**:Java提供了两种创建线程的方式,分别是...

    异步多线程Demo

    这个“异步多线程Demo”很可能是为了帮助学习者理解并实践多线程编程而提供的一个实例。 1. **线程定义**:线程是程序执行的最小单元,每个线程都有自己的程序计数器、系统栈和局部变量。在单个进程中,可以有多个...

    Delphi 多线程 DEMO

    在描述中提到的"简单的多线程DEMO"很可能包含了以下关键知识点: 1. **线程基础**:线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。多线程允许程序同时执行多个不同的任务,提高资源利用率...

    untiy 多线程demo

    "untiy 多线程demo"是一个展示如何在Unity中实现多线程的实例,它包括了封装的协程(Coroutine)和名为Loom.cs的文件,同时提到了AssetStore上的Loom V1.6插件。 1. **Unity的单线程限制**:Unity引擎默认使用单...

    Spring Boot多线程demo

    Spring Boot 多线程 Demo Spring Boot 中使用多线程的方式有很多种,最简单的方式就是使用 @Async 注解来实现。下面我们将详细介绍如何使用 @Async 注解来实现多线程编程。 多线程前言 在 Java 中,多线程编程是...

    linux多线程demo

    这个"linux多线程demo"示例可能是一个用于教学或实践的项目,通过CMake构建系统进行编译,适用于嵌入式环境,比如ARM架构设备。让我们深入探讨一下多线程、CMake以及在嵌入式Linux中的应用。 **多线程** 多线程允许...

    MFC c++ vs2005 多线程 demo

    总结来说,"MFC c++ vs2005 多线程 demo"是一个展示如何在C++环境中利用MFC创建并管理多线程的应用程序,特别是如何在多线程中处理并发任务和同步问题。通过学习这个示例,开发者可以更好地理解和应用多线程技术,以...

    多线程Demo

    本文将深入探讨“多线程Demo”所涉及的知识点,帮助你理解和掌握多线程的基本概念、实现方式以及常见应用场景。 一、多线程基础 1. **线程定义**:线程是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程...

    MFCACE多线程demo

    综上所述,"MFCACE多线程demo"示例将演示如何在MFC应用中有效地利用ACE库实现多线程,以及如何配置项目属性以确保编译和链接成功。通过这种方式,开发者可以充分利用ACE的并发优势,同时保持MFC的易用性和Windows...

Global site tag (gtag.js) - Google Analytics