Java 如何在servlet中使用CyclicBarrier?

Java 如何在servlet中使用CyclicBarrier?,java,multithreading,servlets,cyclicbarrier,Java,Multithreading,Servlets,Cyclicbarrier,您好,这是我关于java线程的第一篇文章……我读了一篇非常有用的文章,并尝试使用线程来加速servlet的处理 在我的webapp中,我有一个servlet需要花费很多时间来处理。实际上主要有3个方法,它们都很长。我想使用CyclicBarrier并行执行3个方法…但我不知道如何在servlet中使用它 下面是我试过的一些演示代码 public class MyServlet extends HttpServlet { @Override protected void doGe

您好,这是我关于java线程的第一篇文章……我读了一篇非常有用的文章,并尝试使用线程来加速servlet的处理

在我的webapp中,我有一个servlet需要花费很多时间来处理。实际上主要有3个方法,它们都很长。我想使用CyclicBarrier并行执行3个方法…但我不知道如何在servlet中使用它

下面是我试过的一些演示代码

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        System.out.println(".................MyServlet Starts...............");

        int param1 = Integer.parseInt(request.getParameter("param1"));
        int param2 = Integer.parseInt(request.getParameter("param2"));

        int param3 = Integer.parseInt(request.getParameter("param3"));
        int param4 = Integer.parseInt(request.getParameter("param4"));

        int param5 = Integer.parseInt(request.getParameter("param5"));
        int param6 = Integer.parseInt(request.getParameter("param6"));

        longProcessing(param1,param2,param3,param4,param5,param6);

        System.out.println(".................MyServlet ends...............");

    } // end of doGet()


    public void longProcessing(int param1,int param2,int param3,int param4,int param5,int param6) {
         //creating CyclicBarrier with 3 parties i.e. 3 Threads needs to call await()
        final CyclicBarrier cb = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                //This task will be executed once all thread reaches barrier
                System.out.println("All threads are arrived at barrier, lets do further processing.......");    
                dofurtherProcess();
            }
        });
        //starting each of thread
        Thread t1 = new Thread(new Task1(cb,param1,param2), "Thread 1");
        Thread t2 = new Thread(new Task2(cb,param3,param4), "Thread 2");
        Thread t3 = new Thread(new Task3(cb,param5,param6), "Thread 3");

        t1.start();
        t2.start();
        t3.start();


    }   

    public void dofurtherProcess(){
        System.out.println("further processing goes here after all task gets completed...");
        /* 
         ......
         ......
         ......        
       */
    }


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

} // end of MyServlet

class Task1 implements Runnable {

    private CyclicBarrier barrier1;
    private int num1,num2;

    public Task1(CyclicBarrier barrier,int para1,int para2) {
        this.barrier1 = barrier;  
        this.num1 = para1;
        this.num2 = para2;
    }

    @Override
    public void run() {

        try {
            // task 1 
            executeTask1();
            barrier1.await();
        } catch (Exception e) {
            System.out.println(e);
        }

    }

    private void executeTask1() {
        for (long i = 0; i <= 100000; i++) {
            if (i == 100000) {
                System.out.printf("executeTask1 () finished...request parameter %d,%d %n",num1,num2);
            }
        }
    }
}

//Runnable task for each thread
class Task2 implements Runnable {

    private CyclicBarrier barrier2;
    private int num3,num4;

     public Task2(CyclicBarrier barrier,int para3,int para4) {
        this.barrier2 = barrier;  
        this.num3 = para3;
        this.num4 = para4;
    }

    @Override
    public void run() {

        try {
            // task 2 
            executeTask2();
            barrier2.await();
        } catch (Exception e) {
            System.out.println(e);
        }

    }

    private void executeTask2() {
        for (long i = 0; i <= 100000; i++) {
            if (i == 100000) {
                System.out.printf("executeTask2 () finished...request parameter %d,%d %n",num3,num4);
            }
        }
    }
}

//Runnable task for each thread
class Task3 implements Runnable {

    private CyclicBarrier barrier3;
    private int num5,num6;

     public Task3(CyclicBarrier barrier,int para5,int para6) {
        this.barrier3 = barrier;  
        this.num5 = para5;
        this.num6 = para6;
    }

    @Override
    public void run() {

        try {
            // task 3 
            executeTask3();
            barrier3.await();
        } catch (Exception e) {
            System.out.println(e);
        }

    }

    private void executeTask3() {
        for (long i = 0; i <= 1000000000L; i++) {
            if (i == 1000000000L) {
                System.out.printf("executeTask3 () finished...request parameter %d,%d %n",num5,num6);
            }
        }
    }
}
预期产出

.................MyServlet Starts...............
executeTask1 () finished...request parameter param1,param2 
executeTask2 () finished...request parameter param3,param4 
executeTask3 () finished...request parameter param5,param6 
All threads are arrived at barrier, lets do further processing.......
further processing goes here after all task gets completed...
.................MyServlet ends...............

你在问什么?您将从3个独立的线程开始,因此当然可以自由完成原始servlet线程。如果你想让它等待,你需要以某种方式将它绑定到自行车载体上,比如在那里放一个信号灯。我用了'whilet1.isAlive | | t2.isAlive | | t3.isAlive{}`它给我所需的输出……我说得对吗?不,那是在忙着等待。使用t1.join;t2.加入;t3.加入;相反,是啊,等待时间真的很长……谢谢如果我想先执行executeTask1,然后执行executeTask2和executeTask3,那么如何等待第一个任务完成,因为executeTask2和executeTask3取决于executeTask1?
.................MyServlet Starts...............
executeTask1 () finished...request parameter param1,param2 
executeTask2 () finished...request parameter param3,param4 
executeTask3 () finished...request parameter param5,param6 
All threads are arrived at barrier, lets do further processing.......
further processing goes here after all task gets completed...
.................MyServlet ends...............