ScheduledThreadPoolExecutor模仿学习

发布时间 2023-06-15 14:51:42作者: 码界小小学生

 

public interface CBlockingQueue<E> {
    boolean add(E e);
    E take();
}

 

import java.util.concurrent.Delayed;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.TimeUnit;

public class CScheduledThreadPoolExecutor extends CThreadPoolExecutor {

    public CScheduledThreadPoolExecutor() {
        super(new CDelayedWorkQueue());
    }

    public void test(Runnable r, String result) {
        CScheduledFutureTask<String> sft = new CScheduledThreadPoolExecutor.CScheduledFutureTask<>(r, result);
        super.getQueue().add(sft);
        ensurePrestart();
    }

    // 语法错误 static class CDelayedWorkQueue<Runnable> implements CBlockingQueue<Runnable> {
    static class CDelayedWorkQueue implements CBlockingQueue<Runnable> {

        private RunnableScheduledFuture<?>[] queue = new RunnableScheduledFuture<?>[5];

        @Override
        public boolean add(Runnable r) {
            RunnableScheduledFuture<?> e = (RunnableScheduledFuture<?>) r;
            queue[0] = e;
            return true;
        }

        @Override
        public RunnableScheduledFuture take() {
            RunnableScheduledFuture<?> first = queue[0];
            return first;
        }
    }


    private class CScheduledFutureTask<V> extends FutureTask<V> implements RunnableScheduledFuture<V> {

        CScheduledFutureTask(Runnable r, V result) {
            super(r, result);
        }

        @Override
        public boolean isPeriodic() {
            return false;
        }

        @Override
        public long getDelay(TimeUnit unit) {
            return 0;
        }

        @Override
        public int compareTo(Delayed o) {
            return 0;
        }
    }
    
}

 

public class CThreadPoolExecutor {

    private final CBlockingQueue<Runnable> workQueue;

    public CThreadPoolExecutor(CBlockingQueue<Runnable> workQueue) {
        this.workQueue = workQueue;
    }

    public CBlockingQueue<Runnable> getQueue() {
        return workQueue;
    }

    void ensurePrestart() {
        addWorker();
    }

    private boolean addWorker() {
        CWorker w = new CWorker();
        w.run();
        return true;
    }

    final void runWorker() {
        Runnable r = workQueue.take();
        r.run();
    }

    // 内部类
    private final class CWorker {
        public void run() {
            runWorker();
        }
    }

}

 

public class ScheduledTest {
    public static void main(String[] args) {
        CScheduledThreadPoolExecutor dtpe = new CScheduledThreadPoolExecutor();
        dtpe.test(() -> System.out.println("模拟CBlockingQueue泛型的类执行"), "");
    }
}