0

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

在我的 web 应用程序中,我有一个 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...............
.................MyServlet ends...............
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 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...............
4

0 回答 0