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

线程运用-抽象类使用

阅读更多
package com.xxx.betcart.server.service.impl.threadmanager;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 线程基本类
 * 
 * 记录线程开始时间/结束时间/ 线程名称/线程属性参数
 * @project commonsTiger
 * @author alanpeng
 * @date 2011-1-7
 * Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved.
 */
public abstract class BaseThread implements Runnable {
    private transient final Logger logger = LoggerFactory.getLogger(BaseThread.class);
    
    private Long startTime;//开始时间

    private String threadName;//线程名字

    private Long endTime;//结束时间

    private Long removeDelay = 0l;//线程结束后多久移除管理,单位秒

    private volatile boolean isRun;//线程是否运行中

    /**
     * 只定义线程名,
     * 线程状态数据执行完成removeDelay秒后删除
     * @param threadName
     * @param removeDelay 小于等于0执行完后删除
     */
    public BaseThread(String threadName, Long removeDelay) {
        this.threadName = threadName;
        this.removeDelay = removeDelay;
    }

    @Override
    public void run() {
       
        try {
            startTime = System.currentTimeMillis();
            excuteTask();
            endTime = System.currentTimeMillis();
        } catch (Exception e) {
            logger.error("开奖线程异常。");
            logger.error(e.getMessage(),e);
        } finally {
            logger.info("开奖线程状态数据移除。");
            ThreadManage.removeThreadData(threadName);

        }
        
    }

    public abstract void excuteTask();

    public Long getStartTime() {
        return startTime;
    }

    public void setStartTime(Long startTime) {
        this.startTime = startTime;
    }

    public String getThreadName() {
        return threadName;
    }

    public void setThreadName(String threadName) {
        this.threadName = threadName;
    }

    public Long getEndTime() {
        return endTime;
    }

    public void setEndTime(Long endTime) {
        this.endTime = endTime;
    }

    public Long getRemoveDelay() {
        return removeDelay;
    }

    public void setRemoveDelay(Long removeDelay) {
        this.removeDelay = removeDelay;
    }

    public boolean isRun() {
        return isRun;
    }

    public void setRun(boolean isRun) {
        this.isRun = isRun;
    }

}



package com.xxx.betcart.server.service.impl.threadmanager;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;


public class ThreadManage {

    public static ScheduledThreadPoolExecutor threadExec = new ScheduledThreadPoolExecutor(50);

    //key为唯一的标识
    public static Map<String, BaseThread> map = new HashMap<String, BaseThread>();

    /**
     * 执行线程,并把线程放入管理MAP中
     * 
     * @param thread
     * @create_time 2010-12-29 下午08:33:15
     */
    public static void excute(BaseThread thread) {
        map.put(thread.getThreadName(), thread);
        threadExec.execute(thread);

    }

    /**
     * 检查线程是否运行中 
     * @param threadName
     * @return T 是 F不是
     * @create_time 2010-12-29 下午08:55:13
     */
    public static boolean isExcute(String threadName) {
        BaseThread thread = map.get(threadName);
        if (thread == null) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 删除线程数据
     * @param threadName
     * @create_time 2010-12-29 下午09:46:48
     */
    public static void removeThreadData(String threadName) {
        map.remove(threadName);
    }

    /**
     * 遍历移除超时线程数据
     * 
     * @create_time 2010-12-29 下午09:58:15
     */
    public static void removeThreadDataTimeOut() {
        for (String name : map.keySet()) {
            BaseThread thread = map.get(name);
            if (thread.getEndTime() != null && thread.getRemoveDelay() > 0) {
                if (System.currentTimeMillis() > (thread.getEndTime() + thread.getRemoveDelay())) {
                    removeThreadData(name);
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
   
    }
}



package com.xxx.betcart.server.service.impl.threadmanager.thread;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xxx.betcart.common.service.BetPlanPackageService;
import com.xxx.betcart.server.service.impl.threadmanager.BaseThread;

/**
 * 派奖线程
 * 
 * @project admin
 * @author alanpeng
 * @date 2011-6-2
 * Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved.
 */
public class SychronizedPrizeThread extends BaseThread {

    private transient final Logger logger = LoggerFactory.getLogger(SychronizedPrizeThread.class);

    private long packageId;
    private BetPlanPackageService betPlanPackageService;

	public SychronizedPrizeThread(String threadName,
			long packageId, BetPlanPackageService betPlanPackageService) {
		super(threadName,0l);
		this.packageId = packageId;
		this.betPlanPackageService = betPlanPackageService;
	}
	public void excuteTask() {
        try {
            setRun(true);
            Thread.currentThread().setName(this.getThreadName());
            betPlanPackageService.synchronousPrizeByPackageId(packageId);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        } finally {
            setRun(false);
        }
    }
}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、...理解并合理运用抽象工厂模式,可以提升软件架构的质量,降低系统维护的成本。

    抽象类和接口 测试结果

    在编程世界中,抽象类和接口是面向对象设计的重要概念,它们都用于实现代码的抽象和多态性,但有着不同的使用场景和规则。这里我们将深入探讨这两种机制,并结合给出的"codePiece"代码片段来分析它们在实际应用中的...

    day24-多线程-设计模式.7z

    2. **工厂方法模式**:工厂方法模式是简单工厂模式的进一步抽象和推广,它定义一个创建对象的接口,让子类决定实例化哪一个类。在多线程场景下,工厂方法模式可以让每个线程根据需要创建自己的对象,降低了线程间的...

    iOS 多线程运用

    2. NSThread:轻量级线程类,允许开发者手动创建和管理线程,但使用相对复杂。 3. NSOperationQueue:基于GCD的高级抽象,提供了任务依赖、优先级等功能,更易于使用和管理。 4. NSTimer:通常在RunLoop中运行,不...

    面试题java

    Java面试题涵盖了诸多核心概念,包括线程、同步异步、面向对象特性、多态、抽象类与接口等。下面将详细解释这些知识点。 1. **线程创建**: - Java中创建线程有两种方式:一是继承`Thread`类并重写`run()`方法,二...

    多线程编程指南

    - **1.5.1 避免显式创建线程**:除非必要,应尽量使用高级抽象如GCD、Operation Queues等。 - **1.5.2 保持你的线程合理的忙**:避免线程空闲或过度使用CPU资源。 - **1.5.3 避免共享数据结构**:减少数据竞争,使用...

    Java抽象类和接口 Java全栈

    在Java编程语言中,抽象类和接口是两个重要的...在Java全栈开发中,灵活运用抽象类和接口可以提高代码质量,降低维护成本,提升系统灵活性。开发者需要根据具体需求来选择使用抽象类还是接口,以达到最佳的设计效果。

    c#多线程编程笔记

    - **Task类**:异步操作的抽象,可以使用`Task.Run()`或`Task.Factory.StartNew()`创建异步任务。 通过理解并熟练运用这些知识点,开发者可以编写出高效、稳定且响应性强的多线程C#应用程序。在实际开发中,还需...

    java面试知识点.docx

    - 接口是抽象类的一种特例,所有方法默认为`public abstract`,成员变量默认为`public static final`。 - 抽象类可以有构造方法,接口则不能。 - 抽象类可以包含非抽象方法,接口中所有方法必须是抽象的。 - ...

    c#线程参考手册 c#线程参考手册 c#线程参考手册

    理解并熟练运用以上知识点,可以帮助开发者高效地编写并发和多线程的C#程序,充分利用多核处理器的性能,同时避免可能出现的并发问题。在实际应用中,还需要结合具体场景灵活选择和使用各种工具和策略,以实现最佳...

    JAVA多线程PPT教案学习.pptx

    3. **线程对象**:Java将线程抽象为Thread类或实现了Runnable接口的对象。 4. **优先级**:线程有优先级,0到10,高优先级的线程会获得更多的CPU时间片。 5. **资源竞争**:多线程共享资源可能导致冲突,需通过`...

    初学java基本概念

    - 抽象类使用 `abstract` 关键字声明,不能实例化。 - 抽象方法只有声明,没有实现,必须在抽象类或实现了该方法的子类中提供实现。 10. 接口(interface): - 类可以使用 `implements` 关键字实现一个或多个...

    Java复习资料.pdf

    - 抽象类与接口:抽象类可以实现接口,实体类可以被抽象类继承,但实体类必须有公共构造器。 3. 抽象类与接口的区别: - 抽象类:包含抽象方法,部分或全部方法未实现。子类必须实现所有抽象方法。 - 接口:只有...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java程序中的线程是在操作系统级别的线程基础上进行抽象的。每个Java程序都有一个主线程,即由JVM启动并执行main方法的线程。线程代表了程序中的执行流,可以在不同的线程之间切换以共享CPU时间。线程的状态包括新建...

    2022中高级Android面试必知百题.pdf

    - 抽象类可以包含抽象方法的实现,而接口只能定义public抽象方法。 - 抽象类可以有非静态成员变量,接口的成员变量默认为public static final。 - 一个类只能继承一个抽象类,但可以实现多个接口。 - 抽象类注重...

    delphi 多线程

    `TThread` 是一个抽象类,它是所有用户定义线程类的基础。创建一个新的线程类时,需要继承 `TThread` 并重写其关键方法,如 `Execute`,在这个方法中定义线程要执行的具体代码。 1. **线程创建与启动**: - 创建...

    使用单独的线程执行程序代码

    5. **异步编程与Task**:.NET 4.0引入了`Task`类,它是异步编程的主要工具,提供了比传统线程更高级别的抽象。Task可以用来执行异步操作,与线程相比,它们更适合于I/O密集型任务。例如: ```csharp Task.Run(() =...

    JAVA面试题( 华为)(答案).pdf

    在实际编程中,根据项目需求和性能考虑,合理选择使用String、StringBuilder或StringBuffer,理解继承与接口的区别以及何时使用,以及熟练运用各种修饰符和容器类,将有助于编写出高效、可维护的代码。

    工厂模式、接口、抽象类的例子

    综上所述,这个示例文件可能包含了一个或多个类,它们可能实现了工厂模式,定义了接口,继承了抽象类,并且可能还有单例模式的运用。这些设计模式和概念的结合展示了如何在实际项目中组织和管理代码,以达到高效、...

    java实战经典学习笔记

    - 接口与抽象类的区别。 - **多态性** - 多态性的实现方式。 - `instanceof`关键字。 - **Object类** - Object类的方法(`toString()`, `equals()`, `hashCode()`等)。 - **包装类** - 基本数据类型的包装类。 ...

Global site tag (gtag.js) - Google Analytics