1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.dy.common.mw.core;
 
import org.apache.logging.log4j.*;
 
import com.dy.common.queue.Queue;
 
/**
 * 2024-11-21 该类已经弃用,改由CoreTimer实现。
 * 当采用Thread实现时,在while(true){}中使用Thread.sleep(),可能导致的严重性能问题,不推荐在循环中使用线程休眠。
 * Java线程实现采用内核线程实现,线程的休眠及唤醒(状态切换)需借助操作系统进行,这是一个极其耗时耗力的操作。
 * 在线程休眠或运行时间较长的情景下,其对性能的影响还不算明显,因为对线程状态的切换并不频繁。
 * 但若线程休眠及运行的时间都很短(例如毫秒/秒),
 * 系统将频繁的对线程状态进行切换,导致严重的性能损耗,并对着循环次数的递增而放大。
 */
@Deprecated
public class CoreThread extends Thread{
    
    private static Logger log = LogManager.getLogger(CoreThread.class.getName()) ;
    
    private static CoreThread instance = new CoreThread() ;
 
    private static Long sleepBigBusy = 100L ;//大忙时(除了恒久任务,还是其他任务),核心线程暂停间隔
    private static Long sleepSmallBusy = 500L ;//小忙时(只有恒久任务,无其他任务),核心线程暂停间隔
    
    private CoreThread(){
    }
    
    public static CoreThread getInstance(){
        return instance ;
    }
    
    /**
     * 设置暂停时长
     * @param sleepBigBusy 大忙时睡眠时长
     * @param sleepSmallBusy 小忙时睡眠时长
     */
    public void setSleep(Long sleepBigBusy, Long sleepSmallBusy){
        CoreThread.sleepBigBusy = sleepBigBusy ;
        CoreThread.sleepSmallBusy = sleepSmallBusy ;
    }
 
    /**
     * 核心单线程,执行所有的单线程任务
     */
    @SuppressWarnings("finally")
    @Override
    public void run() {
        Queue coreQueue = CoreUnit.taskQueue ;
        int count = 0 ;
        int n = 0 ;
        while(true){
            try{
                /**
                 * 此处取出当前队列的节点数量,作为一个定量count处理, 
                 * 原因:
                 * 在处理定量count过程中,可能有的节点又回到队列中,可能新生节点进入队列中,即在处理过程中,队列可能又增长了
                 */
                count = coreQueue.size() ;
                if(count > 0){
                    n = 0 ;
                    while(n < count){
                        CoreTask task = (CoreTask)coreQueue.pop() ;
                        if(task != null){
                            task.execute();
                        }
                        n ++ ;
                    }
                    //大暂停一下
                    sleep(sleepBigBusy) ;
                }else{
                    //小暂停一下
                    sleep(sleepSmallBusy) ;
                }
            }catch(Exception e){
                log.error("核心线程发生异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e);;
            }finally{
                continue ;
            }
        }
    }
}