java代码等待并行代码完成

时间:2014-02-04 19:50:21

标签: java multithreading tomcat runnable

我有一个处理图像的服务器代码。

现在有n个请求尝试执行代码导致OutOfMemory错误或服务器挂起且服务器进入无响应状态。

要阻止代码立即执行所有请求,我限制使用以下方法一次执行一个代码,其中我有一个变量

如果变量为10,则等待变量为0

如果为0则将其设置为10然后执行代码

运行代码并最终将i设置为0

这里的代码 -

static newa.Counter cn;

public int getCounta() {

    return cn.getCount();

}

public void setCounta(int i) {
    cn = new newa.Counter();
    cn.setCount(i);

}

在我这样做的功能 -

public BufferedImage getScaledImage(byte[] imageBytes)
{
    int i=0;
    Boolean b = false;
    BufferedImage scaledImage = null;
    newa.NewClass1 sc = new newa.NewClass1();
    try {
        sc.getCounta();
    } catch (NullPointerException ne) {
        sc.setCounta(0);
    }

    i = sc.getCounta();

    if(i==0) 
    {
        sc.setCounta(10);
        b = true;
    } 
    else
    {
        while( b == false) 
        {
            try 
            {
                Thread.sleep(2000);
                i = sc.getCounta();
                if( i==0) 
                {
                    sc.setCounta(10);
                    b = true;
                    System.out.println("Out of Loop");
                }
            } catch (InterruptedException ex) {
                System.out.println("getScaledImage Thread exception: " + ex);
            }
        }
    }

    ..... execute further code

    try { } catch { } finally { sc.setCounta(0); }

    }

有什么方法可以使用Runnable接口进行简化,或者因为我不知道如何进行多线程。

2 个答案:

答案 0 :(得分:2)

忘记计数器并使用同步方法。将方法头改为:

public synchronized BufferedImage getScaledImage(byte[] imageBytes)

这使得进入方法的所有线程都会等待,直到没有其他线程正在执行该方法。

答案 1 :(得分:0)

如果只需要少量线程进行处理,可以使用Executor框架拥有10个线程的线程池。这将确保一次最多10个线程将处理请求。