• java-线程观察整个生命周期


    package com.srdsoft.test;

    //被观察的对象,定义一个虚拟类,没有实现Runnable run方法,所以用 abstract
    public abstract class ObservableRunnable implements Runnable {

        final protected 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) {
                this.state = state;
                this.thread = thread;
                this.cause = cause;
            }

            public RunnableState getState() {
                return state;
            }

            public Thread getThread() {
                return thread;
            }

            public Throwable getCause() {
                return cause;
            }
        }
    }


    package com.srdsoft.test;

    //观察者接口
    public interface LifeCycleListener {
        
        void onEvent(ObservableRunnable.RunnableEvent event);
    }

    package com.srdsoft.test;

    import java.util.List;

    //观察者
    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);
                        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(ObservableRunnable.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.srdsoft.test;

    import java.util.Arrays;


    public class ThreadLifeCycleTest {
        public static void main(String[] args) {
            new ThreadLifeCycleObserver().concurrentQuery(Arrays.asList("1", "2"));
        }
    }
  • 相关阅读:
    对象的强、软、弱和虚引用
    spark运行模式之一:Spark的local模式安装部署
    Spark Tungsten in-heap / off-heap 内存管理机制--待整理
    sparkContext之一:sparkContext的初始化分析
    mysql分区表之四:分区表性能
    服务的升级和降级
    怎样编写高质量的 Java 代码
    Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
    Spark Streaming之六:Transformations 普通的转换操作
    Spark Streaming之五:Window窗体相关操作
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254097.html
Copyright © 2020-2023  润新知