zoukankan      html  css  js  c++  java
  • 使用观察者模式观察线程的生命周期

    ObservableRunnable

    package com.dwz.concurrency2.chapter5;
    
    
    public abstract class ObservableRunnable implements Runnable {
        protected final LifeCycleListener listener;
        
        public ObservableRunnable(final LifeCycleListener listener) {
            this.listener = listener;
        }
        
        protected void notifyChange(final RunnableEvent event) {
            listener.onEvent(event);
        }
        
        public enum RunnableState {
            RUNNING, ERROR, DONE;
        }
        
        public static class RunnableEvent {
            private final RunnableState state;
            private final Thread thread;
            private final Throwable cause;
            public RunnableEvent(RunnableState state, Thread thread, Throwable cause) {
                super();
                this.state = state;
                this.thread = thread;
                this.cause = cause;
            }
            public RunnableState getState() {
                return state;
            }
            public Thread getThread() {
                return thread;
            }
            public Throwable getCause() {
                return cause;
            }
        }
    }

    LifeCycleListener

    package com.dwz.concurrency2.chapter5;
    
    import com.dwz.concurrency2.chapter5.ObservableRunnable.RunnableEvent;
    
    public interface LifeCycleListener {
    
        public void onEvent(RunnableEvent event);
        
    }

    ThreadLifeCycleObserver

    package com.dwz.concurrency2.chapter5;
    
    import java.util.List;
    
    import com.dwz.concurrency2.chapter5.ObservableRunnable.RunnableEvent;
    
    public class ThreadLifeCycleObserver implements LifeCycleListener {
        private final Object LOCK = new Object();
        
        public void concurrentQuery(List<String> ids) {
            if(ids == null || ids.isEmpty()) {
                return;
            }
            
            ids.stream().forEach(id -> new Thread(new ObservableRunnable(this) {
                @Override
                public void run() {
                    try    {
                        notifyChange(new RunnableEvent(RunnableState.RUNNING, Thread.currentThread(), null));
                        System.out.println("query for the id " + id);
                        Thread.sleep(1000L);
                        int x = 1/0; 
                        notifyChange(new RunnableEvent(RunnableState.DONE, Thread.currentThread(), null));
                    } catch(Exception e) {
                        notifyChange(new RunnableEvent(RunnableState.ERROR, Thread.currentThread(), e));
                    }
                }
            }, id).start());
        }
            
        @Override
        public void onEvent(RunnableEvent event) {
            synchronized (LOCK) {
                System.out.println("The runnable [" + event.getThread().getName() + "] data changed and state is [" + event.getState() + "]");
            }
            
            if(event.getCause() != null) {
                System.out.println("The runnable [" + event.getThread().getName() + "] process failed.");
                event.getCause().printStackTrace();
            }
        }
    }

    测试代码:

    package com.dwz.concurrency2.chapter5;
    
    import java.util.Arrays;
    
    public class ThreadLifeCycleClient {
        public static void main(String[] args) {
            new ThreadLifeCycleObserver().concurrentQuery(Arrays.asList("1", "2"));
        }
    }
  • 相关阅读:
    puppeteer自动化测试系列之三---端对端测试中常用的 Puppeteer 操作
    puppeteer自动化测试系列之二---puppeteer常用方法
    团队作业8—团队项目用户验收评审
    Beta冲刺--第四天
    Beta冲刺--第三天
    Beta冲刺--第二天
    Beta冲刺--第一天
    Spring_Four -- 团队项目设计完善&编码测试
    Alpha冲刺
    团队作业6—《Spring_Four》团队项目系统设计改进与详细设计
  • 原文地址:https://www.cnblogs.com/zheaven/p/12107495.html
Copyright © 2011-2022 走看看