Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算工作线程仍在处理时所用的时间_Java_Multithreading - Fatal编程技术网

Java 计算工作线程仍在处理时所用的时间

Java 计算工作线程仍在处理时所用的时间,java,multithreading,Java,Multithreading,我无法获取工作线程的处理时间。我有一个线程监视我的工作线程的处理时间,并报告所花费的时间以及有多少工作线程处于处理状态 问题 我的监视线程,总是报告没有处于处理状态的工作线程?我怀疑我的监视线程无法正确评估工作线程 我已经同步了一些获取和记录处理时间和处理状态的方法。这是否足够让我的监视器线程跟踪处理时间,而不进行线程覆盖 iProcessing布尔变量是否应为易失变量 我的工人阶级 public class MyWorker implements Runnable { private

我无法获取工作线程的处理时间。我有一个线程监视我的工作线程的处理时间,并报告所花费的时间以及有多少工作线程处于处理状态

问题

  • 我的监视线程,总是报告没有处于处理状态的工作线程?我怀疑我的监视线程无法正确评估工作线程

  • 我已经同步了一些获取和记录处理时间和处理状态的方法。这是否足够让我的监视器线程跟踪处理时间,而不进行线程覆盖

  • iProcessing布尔变量是否应为易失变量

  • 我的工人阶级

    public class MyWorker implements Runnable {
    
        private final int WAIT_INTERVAL = 200;
        private MyService myService;
        private MyProvider myProvider;
        private boolean stopRequested = false;
        private boolean isProcessing; // Flag to indicate the worker is currently processing a message
        private long processingStartTime; //captures when the worker started processing a message
        private Logger logger = new Logger();
    
    public MyWorker(MyService myService, MyProvider myProvider){
            this.myService = myService;
            this.myProvider = myProvider;
            this.isProcessing = false;
            this.processingStartTime = -1;
        }
    
        public void setStopRequested() {
            stopRequested = true;
        }
    
    
        private synchronized void recordProcessingStart(long start){
            isProcessing = true;
            processingStartTime = start;
        }
    
        private synchronized void recordProcessingStop(){
            isProcessing = false;
            processingStartTime = -1;
        }
    
        public synchronized boolean isProcessing(){
            return isProcessing;
        }
    
        public synchronized long getProcessingStartTime(){
            return processingStartTime;
        }
    
        @Override
        public void run() {
    
            while (!stopRequested) {
                boolean processingMessage = false;
                List<Message> messages = myProvider.getPendingMessages();
                if (messages.size() != 0) {
                    logger.log("We have " + messages.size() + " messages");
                    recordProcessingStart(System.currentTimeMillis());
                    for (Message message : messages) {
                        processMessage(messages);
                    }
                    recordProcessingStop();
                }
    
                if (!(processingMessage || stopRequested)) {
                    // this is to stop the thread from spinning when there are no messages
                    try {
                        Thread.sleep(WAIT_INTERVAL);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        private void processMessage(Message messages){
            myService.process(messages);
        }
    }
    
    公共类MyWorker实现可运行{
    专用最终整数等待间隔=200;
    私人MyService-MyService;
    私人MyProvider MyProvider;
    私有布尔stopRequested=false;
    private boolean isProcessing;//指示工作进程当前正在处理消息的标志
    private long processingStartTime;//捕获工作进程开始处理消息的时间
    专用记录器=新记录器();
    公共MyWorker(MyService MyService,MyProvider MyProvider){
    this.myService=myService;
    this.myProvider=myProvider;
    this.isProcessing=false;
    this.processingStartTime=-1;
    }
    公共无效setStopRequested(){
    stopRequested=true;
    }
    专用同步的void recordProcessingStart(长启动){
    isProcessing=true;
    processingStartTime=开始;
    }
    私有同步的void recordProcessingStop(){
    isProcessing=false;
    processingStartTime=-1;
    }
    公共同步布尔值isProcessing(){
    返回处理;
    }
    公共同步长getProcessingStartTime(){
    返回处理开始时间;
    }
    @凌驾
    公开募捐{
    而(!stopRequested){
    布尔处理消息=false;
    List messages=myProvider.getPendingMessages();
    如果(messages.size()!=0){
    logger.log(“我们有”+消息.size()+“消息”);
    recordProcessingStart(System.currentTimeMillis());
    用于(消息:消息){
    processMessage(消息);
    }
    recordProcessingStop();
    }
    如果(!(处理消息| |停止请求)){
    //这是为了在没有消息时阻止线程旋转
    试一试{
    线程睡眠(等待间隔);
    }捕捉(中断异常e){
    e、 printStackTrace();
    }
    }
    }
    }
    私有void processMessage(消息消息){
    进程(消息);
    }
    }
    
    WorkerManager类

    public class WorkerManager implements Runnable {
    
        private MyWorker[] workers;
        private int workerCount;
        private boolean stopRequested;
        private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        private Logger logger = new Logger();
    
        public WorkerManager(int count) {
            this.workerCount = count;
        }
    
        @Override
        public void run() {
            stopRequested = false;
            boolean managerStarted = false;
    
            while (!stopRequested) {
                if (!managerStarted) {
                    workers = new MyWorker[workerCount];
                    for (int i = 0; i < workerCount; i++) {
                        final Thread workerThread = new Thread(workers[i], "Worker-" + (i + 1));
                        workerThread.start();
                    }
                    startProcessMonitoringThread();
                    managerStarted = true;
                }
            }
        }
    
        public void stop() {
            stopRequested = true;
        }
    
        public void cleanUpOnExit() {
            for (MyWorker w : workers) {
                w.setStopRequested();
            }
            stopProcessMonitoringThread();
        }
    
        private void startProcessMonitoringThread(){
    
            scheduledExecutorService = Executors.newScheduledThreadPool(1);
            scheduledExecutorService.scheduleWithFixedDelay( new WorkerMonitorThread(workers), 1, 1, TimeUnit.MINUTES);
            logger.info("Monitoring of worker threads initialized ...");
        }
    
        private void stopProcessMonitoringThread(){
            scheduledExecutorService.shutdown();
            logger.info("Successfully shutdown worker monitoring thread ...");
        }
    
    
        private class WorkerMonitorThread implements Runnable{
    
            private MyWorker[] workers;
            WorkerMonitorThread(MyWorker workers[]){
                this.workers = workers;
    
            }
    
            @Override
            public void run() {
                String trackingId = "["+ UUID.randomUUID().toString() + "] - ";
                logger.info(trackingId + "Calculating processing times of worker threads ...");
    
                StringBuilder sb = new StringBuilder();
                int totalWorkersInProcess = 0;
                for (int i = 0; i < workerCount; i++) {
                    MyWorker worker = workers[i];
                    if(worker.isProcessing()){
                        totalWorkersInProcess++;
                        long startTime = worker.getProcessingStartTime();
                        long currentTime = System.currentTimeMillis();
                        long duration = currentTime - startTime;
                        sb.append(trackingId + "Worker-" + (i + 1) + " has been processing for the last : " + duration + " ms");
                    }
                }
                sb.append(trackingId + "Total worker(s) in progress : " + totalWorkersInProcess);
                logger.info(sb.toString());
            }
        }
    }
    
    公共类WorkerManager实现可运行{
    私人雇员[]工人;
    私人内部工人计数;
    请求私有布尔值;
    私有ScheduleXecutorService ScheduleXecutorService=Executors.NewsingleThreadScheduleXecutor();
    专用记录器=新记录器();
    公共WorkerManager(整数计数){
    this.workerCount=计数;
    }
    @凌驾
    公开募捐{
    stopRequested=false;
    布尔值managerStarted=false;
    而(!stopRequested){
    如果(!managerStarted){
    工人=新的我的工人[工人计数];
    对于(int i=0;i
    您还没有创建工人

    查看WorkerManager运行方法的代码:

                workers = new MyWorker[workerCount]; // Create an array of MyWorker, but each element of the array is null.
                for (int i = 0; i < workerCount; i++) {
                    final Thread workerThread = new Thread(workers[i], "Worker-" + (i + 1)); // <-- Creates a thread and pass a null MyWorker.
                    workerThread.start(); // NullPointers are coming on the other thread.
                }
    
    然后,创建
        public WorkerManager(int count, MyService myService, MyProvider myProvider) {
            this.workerCount = count;
            this.myService = myService;
            this.myProvider = myProvider;
        }
    
                workers = new MyWorker[workerCount];
                for (int i = 0; i < workerCount; i++) {
                    workers[i] = new MyWorker(myService, myProvider);
                }