相关疑难解决方法(0)

Java线程创建开销

传统观点告诉我们,大批量企业Java应用程序应优先使用线程池来生成新的工作线程.使用java.util.concurrent使这简单明了.

但是,确实存在线程池不适合的情况.我目前正在努力的具体示例是使用InheritableThreadLocal,它允许ThreadLocal变量"传递"到任何生成的线程.使用线程池时,此机制会中断,因为工作线程通常不是从请求线程生成的,而是预先存在的.

现在有办法解决这个问题(线程本地可以显式传入),但这并不总是合适或实用.最简单的解决方案是按需生成新的工作线程,然后让它InheritableThreadLocal完成它的工作.

这让我们回到刚才的问题 - 如果我有一个高容量的网站,在这里用户请求的线程产卵关每个半打工作线程(即不使用线程池),这是怎么回事给JVM的一个问题?我们可能会谈论每秒创建几百个新线程,每个线程持续不到一秒钟.现代JVM是否能很好地优化这一点?我记得在Java中需要对象池的日子,因为对象创建很昂贵.从此变得不必要了.我想知道是否同样适用于线程池.

如果我知道要测量什么,我会对它进行基准测试,但我担心的是问题可能比用剖析器测量的更微妙.

注意:使用线程本地的智慧不是问题所在,所以请不要建议我不要使用它们.

java performance multithreading

45
推荐指数
2
解决办法
1万
查看次数

简单的线程管理 - Java - Android

我有一个应用程序,当用户要求过滤图像时会生成一个新线程.

这是我所拥有的唯一类型的任务,并且所有任务都同等重要.

如果我要求太多并发线程(我想要的最大值是9),线程管理器会抛出RejectedExecutionException.

在那一刻,我所做的是;

// Manage Concurrent Tasks
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>();

@Override
public int remainingSize() {
    return tasks.size();
}

@Override
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) {
    try{
        task.execute(currentThumbnail);
        while(!tasks.isEmpty()){
            task = tasks.remove();
            task.execute(currentThumbnail);
        }
    } catch (RejectedExecutionException r){
        Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue");
        tasks.add(task);
    }
}
Run Code Online (Sandbox Code Playgroud)

只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在待办事项.

显而易见的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会重新启动(直到它不再需要它之后).

只是想知道我是否应该使用一个简单的模型来管理这类事情.我需要任务在完成后通知队列,所以我知道有空间,但我不确定如何.

亲切的问候,

加文

java multithreading android

8
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

multithreading ×2

android ×1

performance ×1