JAVA并发:使用Sempare, Handler和线程池写的加载框架
2015-08-29 15:11
441 查看
package com.example.imageloaderpratise; import java.util.LinkedList; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initBackThread(); for(int i = 0 ; i < 10 ; i++){ addTask(i); } } private void initBackThread() { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); backHandler = new Handler(){ public void handleMessage(Message msg) { int tag = (int) msg.obj; threadPool.execute(getTask()); Log.e("xxx", "handlerTag:" + tag); try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } }; }; backSemaphore.release(); Looper.loop(); } }).start(); } private void addTask(int i){ mTask.add(getTask(i)); if(backHandler == null){ try { backSemaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } } Message message = backHandler.obtainMessage(); message.obj = i; backHandler.sendMessage(message); } private synchronized Runnable getTask(){ return mTask.removeLast(); } LinkedList<Runnable> mTask = new LinkedList<Runnable>(); Semaphore semaphore = new Semaphore(3); Semaphore backSemaphore = new Semaphore(0); ExecutorService threadPool = Executors.newFixedThreadPool(2); Handler backHandler; /*Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { }; };*/ protected Runnable getTask(final int tag) { return new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("xxx", Thread.currentThread().getName() + ":" + "执行完将释放..." + "tag:" + tag); semaphore.release(); Log.e("xxx", Thread.currentThread().getName() + ":" + "执行完将释放了***" + "tag:" + tag); } }; } }
相关文章推荐
- 源码安装JDK
- eclipse jee配置tmocat
- udig二次开发 eclipse环境搭建
- 使用maven来管理java项目
- Eclipse代码自动提示
- Java单例模式
- 一个JAVA新手问题,关于setName和getName
- Java使用IText(VM模版)导出PDF,IText导出word(二)
- java枚举类型的实现原理
- 详细讲解Java中方法的重载和重写
- 欢迎使用CSDN-markdown编辑器
- AndroidStudio导入Eclipse工程
- Java学习笔记(2):null 和空字符串的区别
- java HashMap那点事
- 用Eclipse创建第一个Spring项目(最最入门级)
- 折腾ubuntu14.04安装jdk1.6记录
- java注解
- 模拟JavaWeb过滤器——责任链模式
- java按指定编码写入和读取文件内容的
- myeclipse 安装反编译插件