Создание пула потоков для обработки сетевых подключений - PullRequest
1 голос
/ 26 января 2012

Ниже приведен пример потока изображений, который я использую, который вызывается каждый раз, когда появляется изображение для показа.Я использую код, подобный этому, чтобы сделать другие сетевые соединения также.Я подозреваю, что проблема в моих рабочих характеристиках заключается в том, что у меня отсутствует пул потоков.

Если несколько или многие из этих потоков создаются до их завершения, они не существуют одновременно, неизменно снижая производительность?

Как мне реализовать пул потоков?Я видел, как этот термин распространялся, но мне не удалось найти хороший простой пример его реализации.

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());
            }

        }

    }

}

Кроме пула потоков, есть ли проблемы с моим кодом?Я избежал потока событий пользовательского интерфейса, создав такой поток?

Ответы [ 2 ]

0 голосов
/ 30 января 2012

Кроме пула потоков, есть ли проблемы с моим кодом?

Кроме того, убедитесь, что вы close() используете свои InputConnection и HttpConnection объекты в блоке finally в конце вашего run() метода. В некоторых старых версиях BlackBerry OS возникали проблемы, из-за которых потоки не заканчивались и не собирались.

0 голосов
/ 26 января 2012

Если несколько или многие из этих потоков создаются до их завершения, они не существуют одновременно, что неизбежно снижает производительность?

Да, если одновременно запущено много потоков, переключение контекста между ними может повлиять на общую производительность, особенно если эти потоки мало что делают. Кроме того, создание потоков также довольно дорого. Здесь может помочь пул потоков, поскольку вы могли бы создать только разумное количество потоков, которые выполняются одновременно, и эти потоки могут быть «использованы повторно», то есть, когда они закончили свои задачи, они могут выполнять другие задачи, если некоторые существуют.

Как мне реализовать пул потоков? Я видел этот термин, но мне не удалось найти хороший простой пример его реализации.

Начните с ThreadPoolExecutor и это JavaDoc .

Несколько аннотаций:

  • имена классов по соглашению должны начинаться с заглавной буквы (myConnectionFactory)
  • В зависимости от того, что делает фабрика соединений, вы можете использовать один экземпляр (однако вам следует синхронизировать доступ там, где это необходимо)
  • если несколько потоков используют один экземпляр ImageThreadCallback, вам может потребоваться некоторая синхронизация (в идеале не для всего метода, а для любых внутренних операций записи, которые он делает, однако это зависит от реализации).
...