java - Java (Android) 中的优先级 ThreadPoolExecutor

标签 java android multithreading thread-safety

我正在尝试创建一个具有优先级的 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) is undefined with a single quickfix: Change type “队列”到 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();

    }

}

最佳答案

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

关于java - Java (Android) 中的优先级 ThreadPoolExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7792767/

相关文章:

java - 通过注释连接 Spring 构造函数

android - 如何以编程方式使自定义对话框成为屏幕高度的 100%?

android - 用 Jsoup 解析表

python - 在Python2.7中实现Barrier

python - 并行化进程相互依赖的 Python 进程时遇到问题

java - 安全约束的 url 模式不起作用

java - Hibernate加载同一行

java - Conway 生命游戏的多线程 Java 程序 - 边界单元的竞争

java - 带选择的 CriteriaBuilder 不允许没有构造函数

安卓双卡信号强度