下面是我正在使用的图像线程的示例,每次有要显示的图像时都会调用该图像线程。我使用类似于此的代码来执行其他网络连接。 问题,我怀疑我的表演问题,是我缺乏线程池。
如果在完成之前创建了多个或多个这些线程,它们是否同时存在,总是会降低性能?
我如何实现线程池?我已经看到这个术语浮出水面,但我没有找到一个很好的简单例子来实现它。
public class ImageThread extends Thread {
private String url;
private HttpConnection httpConn;
private InputStream is;
private JSONArray array;
private Bitmap image;
private ImageThreadCallback c;
private static boolean hasImageCache = false;
private static MultiMap imageCache;
public ImageThread(String url, ImageThreadCallback c, String ident){
System.out.println("Connection begin!");
this.url = url;
this.c = c;
}
public void notifyUs(){
this.c.update(image);
}
public void run(){
myConnectionFactory connFact = new myConnectionFactory();
ConnectionDescriptor connDesc;
connDesc = connFact.getConnection(url);
System.out.println("Connection factory!");
if(connDesc != null)
{
System.out.println("Connection not null!");
httpConn = (HttpConnection) connDesc.getConnection();
try {
httpConn.setRequestMethod(HttpConnection.GET);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
is = null;
try
{
final int iResponseCode = httpConn.getResponseCode();
System.out.println("Connection in run!");
// Get InputConnection and read the server's response
InputConnection inputConn = (InputConnection) httpConn;
try {
is = inputConn.openInputStream();
System.out.println("Connection got inputstream!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] data = null;
try {
data = IOUtilities.streamToBytes(is);
System.out.println("Connection got data!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
EncodedImage hai = EncodedImage.createEncodedImage(data, 0, data.length);
image = hai.getBitmap();
notifyUs();
}
catch(IOException e)
{
System.err.println("Caught IOException: " + e.getMessage());
}
}
}
}
除了没有线程池,我的代码有什么问题吗?我通过创建这样的线程避免了ui事件线程?
答案 0 :(得分:0)
除了没有线程池,我的代码有什么问题吗?
此外,请确保close()
方法末尾InputConnection
阻止HttpConnection
和finally
个run()
个对象。一些较旧的BlackBerry OS版本存在问题,这可能导致线程无法完成并被垃圾收集。
答案 1 :(得分:-1)
如果在完成之前创建了多个或多个这些线程,它们是否同时存在,总是会降低性能?
是的,如果有许多线程同时运行,它们之间的上下文切换可能会达到整体性能,特别是如果这些线程没有做太多的话。另外,创建线程也非常昂贵。线程池可能对此有所帮助,因为您只创建了可以并发运行的合理数量的线程,并且这些线程可以“重用”,即当它们完成任务时,如果存在某些线程,它们可以执行其他任务。
我如何实现线程池?我已经看到这个术语浮出水面,但我没有找到一个很好的简单例子来实现它。
从ThreadPoolExecutor
开始,它是JavaDoc。
也有一些注释:
myConnectionFactory
)ImageThreadCallback
实例,您可能需要一些同步(理想情况下不是整个方法,而是根据它所做的任何内部写入,但这取决于实现)。