创建线程池以处理网络连接

时间:2012-01-25 22:30:26

标签: blackberry java-me

下面是我正在使用的图像线程的示例,每次有要显示的图像时都会调用该图像线程。我使用类似于此的代码来执行其他网络连接。 问题,我怀疑我的表演问题,是我缺乏线程池。

如果在完成之前创建了多个或多个这些线程,它们是否同时存在,总是会降低性能?

我如何实现线程池?我已经看到这个术语浮出水面,但我没有找到一个很好的简单例子来实现它。

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事件线程?

2 个答案:

答案 0 :(得分:0)

  

除了没有线程池,我的代码有什么问题吗?

此外,请确保close()方法末尾InputConnection阻止HttpConnectionfinallyrun()个对象。一些较旧的BlackBerry OS版本存在问题,这可能导致线程无法完成并被垃圾收集。

答案 1 :(得分:-1)

  

如果在完成之前创建了多个或多个这些线程,它们是否同时存在,总是会降低性能?

是的,如果有许多线程同时运行,它们之间的上下文切换可能会达到整体性能,特别是如果这些线程没有做太多的话。另外,创建线程也非常昂贵。线程池可能对此有所帮助,因为您只创建了可以并发运行的合理数量的线程,并且这些线程可以“重用”,即当它们完成任务时,如果存在某些线程,它们可以执行其他任务。

  

我如何实现线程池?我已经看到这个术语浮出水面,但我没有找到一个很好的简单例子来实现它。

ThreadPoolExecutor开始,它是JavaDoc

也有一些注释:

    按照惯例,
  • 类名应以大写字母(myConnectionFactory
  • 开头
  • 取决于连接工厂的工作,您可能希望使用单个实例(但是您应该在需要时同步访问)
  • 如果多个线程共享一个ImageThreadCallback实例,您可能需要一些同步(理想情况下不是整个方法,而是根据它所做的任何内部写入,但这取决于实现)。