我有一个处理图像的服务器代码。
现在有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接口进行简化,或者因为我不知道如何进行多线程。
答案 0 :(得分:2)
忘记计数器并使用同步方法。将方法头改为:
public synchronized BufferedImage getScaledImage(byte[] imageBytes)
这使得进入方法的所有线程都会等待,直到没有其他线程正在执行该方法。
答案 1 :(得分:0)
如果只需要少量线程进行处理,可以使用Executor框架拥有10个线程的线程池。这将确保一次最多10个线程将处理请求。