首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ThreadPoolExecutor和DiscardPolicy

使用ThreadPoolExecutor和DiscardPolicy
EN

Stack Overflow用户
提问于 2015-05-18 09:41:05
回答 1查看 4.1K关注 0票数 2

我需要使用ThreadPoolExecutor创建一个客户端队列,如果超过某个数字(例如,5),我需要能够删除客户端。这有点像DDOS保护。当客户机#6请求我的服务器时-它被删除了,等等。我得到了我的服务器和客户端代码,但是我不知道如何实现ThreadPoolExecutor和DiscardPolicy。想法还是例子?

简单服务器:

代码语言:javascript
复制
   import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class Server {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

        ServerSocket server = new ServerSocket (3000);

        ExecutorService es = Executors.newFixedThreadPool(2);

        Semaphore semaphore = new Semaphore (2);

        while(true){

        semaphore.acquire();

        Socket accept2 = server.accept();

        es.execute(()->{
            try (Socket accept = accept2) {
            serve(accept);
            } catch (Exception exception) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, exception);
            } 
            finally {
                semaphore.release();

            }
        });        

        }

    }

    private static void serve(final Socket accept) throws ClassNotFoundException, IOException {
        InputStream inputStream = accept.getInputStream();
        OutputStream outputStream = accept.getOutputStream();

        ObjectInputStream inputStream2 = new ObjectInputStream (inputStream);

        while (true){
            Object readObject = inputStream2.readObject();
            System.out.println(readObject);
        }

        }

    }

还有一个简单的客户:

代码语言:javascript
复制
  import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.net.Socket;

    public class Client {

    public static void main(String[] args) throws IOException, InterruptedException {
        Socket socket = new Socket ("localhost", 3000);
        ObjectOutputStream oos = new ObjectOutputStream (
                socket.getOutputStream());
        oos.writeObject("First!");
        Thread.sleep(10000);
        oos.writeObject("First again!");
        Thread.sleep(10000);
        oos.writeObject("First again again!");

        }

    }
EN

回答 1

Stack Overflow用户

发布于 2016-02-29 03:22:04

ThreadPoolExecutorDiscardPolicy一起使用如下所示:

代码语言:javascript
复制
  int poolSize=1;
  int maxPoolSize=2;
  int queueSize=5;
  long aliveTive=1000;
  ArrayBlockingQueue<Runnable> queue= new ArrayBlockingQueue<Runnable>(queueSize);
  ThreadPoolExecutor executor= new ThreadPoolExecutor(poolSize,maxPoolSize,aliveTive,
                    TimeUnit.MILLISECONDS,queue,new ThreadPoolExecutor.DiscardPolicy());
}

拒绝任务:

在方法execute(Runnable)中提交的新任务将在执行器被关闭时被拒绝,并且当执行器对最大线程和工作队列容量都使用有限边界时将被拒绝,并且已饱和。

在这两种情况下,execute方法都会调用其RejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor)方法的RejectedExecutionHandler

提供了四个预定义的处理程序策略:

  1. 在默认的ThreadPoolExecutor.AbortPolicy中,处理程序在拒绝时抛出一个运行时RejectedExecutionException。
  2. ThreadPoolExecutor.CallerRunsPolicy中,调用执行本身的线程运行任务。这提供了一个简单的反馈控制机制,它将减慢新任务提交的速度。
  3. ThreadPoolExecutor.DiscardPolicy中,不能执行的任务被简单地删除。
  4. ThreadPoolExecutor.DiscardOldestPolicy中,如果未关闭执行器,则删除工作队列顶部的任务,然后重试执行(这可能再次失败,导致重复执行)。

有关更多细节,请查看此文档页面

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30299784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档