ScheduledThreadPoolExecutor模仿学习

 

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泛型的类执行"), "");
    }
}

 

posted @   码界小小学生  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示