Приоритет ThreadPoolExecutor в Java (Android) - PullRequest
6 голосов
/ 17 октября 2011

Я пытаюсь сделать ThreadPoolExecutor с приоритетом. Поэтому я определяю

private static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL,  MAXPOOL, TimeUnit.SECONDS,  
     queue, new mThreadFactory());

Таким образом, ключ теперь является ссылкой на очередь. Но когда я заявляю:

static PriorityBlockingQueue<mDownloadThread> queue=new PriorityBlockingQueue<mDownloadThread>(MAXPOOL,new DownloadThreadComparator());

Компилятор выдает ошибку в первой строке: Конструктор ThreadPoolExecutor (int, int, int, TimeUnit, PriorityBlockingQueue, FileAccess.mThreadFactory) не определен с одним быстрым исправлением: Изменить тип 'очередь' к BlockingQueue . Можете ли вы помочь мне понять, в чем проблема?

Спасибо

Дополнительная информация:

Для сравнения исполняемых файлов я реализовал следующий класс

class mDownloadThread implements Runnable{      
    private Runnable mRunnable;     
    private int priority;       
    mDownloadThread(Runnable runnable){
        mRunnable=runnable;         
    }

    @Override
    public void run() {
        mRunnable.run();        
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }       
}

Компаратор:

class DownloadThreadComparator implements Comparator<mDownloadThread>{
    @Override
    public int compare(mDownloadThread arg0, mDownloadThread arg1) {

    if (arg0==null && arg1==null){
        return 0;
    } else if (arg0==null){
        return -1;
    } else if (arg1==null){
        return 1;
    }
    return arg0.getPriority()-arg1.getPriority();

    }

}

Ответы [ 2 ]

6 голосов
/ 17 октября 2011

ThreadPoolExecutor конструктор принимает BlockingQueue<Runnable>, а не BlockingQueue<? extends Runnable>, поэтому вы не можете передать ему PriorityBlockingQueue<mDownloadThread> экземпляр.

Вы можете изменить тип queue на PriorityBlockingQueue<Runnable>, но в этом случае вы не сможете реализовать Comparator<mDownloadThread> без приведения внутри метода compare.

Другое решение состоит в том, чтобы обойти обычную проверку типов, но вы должны будете отправлять только экземпляры mDownloadThread в execute метод:

static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL, 
        MAXPOOL, TimeUnit.SECONDS, (PriorityBlockingQueue) queue, new mThreadFactory());
4 голосов
/ 17 октября 2011

Проблема в том, что ThreadPoolExecutor ожидает BlockingQueue<Runnable>, а вы передаете PriorityBlockingQueue<mDownloadThread>.PriorityBlockingQueue реализует BlockingQueue, так что это не проблема.Проблема в Runnable.Вы не можете передать общий тип mDownloadThread, где ожидалось Runnable.

Исправлено следующее:

static PriorityBlockingQueue<Runnable> queue=new PriorityBlockingQueue<Runnable>(MAXPOOL,new DownloadThreadComparator());

&&

class DownloadThreadComparator implements Comparator<Runnable>{  

Если ThreadPoolExecutor были написаны, чтобы принять BlockingQueue<? extends Runnable> что у вас будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...