首页 > 系统 > Android > 正文

Android绾跨▼姹犱娇鐢ㄧ粓缁撶増

2019-11-09 18:16:40
字体:
来源:转载
供稿:网友
鍘熷垱浣滃搧锛屽厑璁歌浆杞斤紝杞浇鏃惰鍔″繀浠ヨ秴閾炬帴褰㈠紡鏍囨槑鏂囩珷 鍘熷鍑哄 銆佷綔鑰呬俊鎭拰鏈0鏄庛€傚惁鍒欏皢杩界┒娉曞緥璐d换銆?a target="_blank" href="http://mzh3344258.blog.51cto.com/1823534/1313611" style="padding:0px; margin:0px; color:rgb(75,0,2); text-decoration:none">http://mzh3344258.blog.51cto.com/1823534/1313611

Android绾跨▼姹犱娇鐢ㄧ粓缁撶増

鏈変竴娈垫椂闂存病鍐欏崥鏂囦簡锛屼粖澶╂娊绌烘€荤粨涓€涓嬶紝涔熷笇鏈涜兘閫氳繃鑷繁鍐欑殑杩欎簺鏂囩珷锛屽姞娣辩悊瑙g殑鍚屾椂鑳藉府

鍔╁湪鎶€鏈柟闈㈡湁鐤戠偣鐨勬湅鍙嬫悶娓呮涓墍浠ョ劧鏉ワ紝鐢变簬缁忓父浼氬湪缃戜笂鎴栫兢閲岀湅鍒版湁鏈嬪弸浼氶棶绾跨▼鏂归潰鐨?/span>

涓滆タ锛屽氨鍍忔垜涓€涓湅鍙嬩粬浠€佸笀璁茬殑锛孞2SE銆丣2EE閲岄潰浣跨敤鐨勭嚎绋嬫柟闈㈢殑涓滆タ鍙兘涓嶆槸澶锛屼絾鏄?/span>

鍦ˋndroid寮€鍙戦噷闈紝鐜╃殑灏辨槸绾跨▼锛圲IThread锛夛紒濂戒簡锛屽簾璇濆氨璇磋繖涔堝鍚э紝鐩村叆姝i锛佷粖澶╄璁茬殑

涓滆タ灏辨槸绾跨▼姹犮€佺嚎绋嬬殑楂樻晥鐜囦娇鐢紝鐏垫椿鎺у埗锛佷粖澶╂椹垜灏辩敤鏈€甯哥敤鐨勫嚑绉嶆柟寮忔潵鍒嗗埆瀹炵幇搴旂敤

涓娇鐢ㄧ殑绾跨▼鏂归潰鐨勭煡璇嗭紝锛堝叡鍐欎簡涓や釜涓嶅悓鍏ュ彛鐨凙ctivity鏉ュ垎寮€涓嶅悓鐨勫疄鐜版柟寮忥紝澶у鍙互鑷娉?/span>

閲夾ndroidManifest.xml涓殑Launch鍏ュ彛鎴栨墦寮€娉ㄩ噴锛変换浣曞彂浠g爜涓殑鍏蜂綋瀹炵幇鏁堟灉锛屽ソ浜嗭紝鍏堥殢渚垮垪

鍑犱釜鍚э紝濡傦細AsyncTask銆丷unnable銆乀hread銆乀hreadPool銆丒xecutors绛夌瓑鐨勪娇鐢紝鐪嬫垜鏂囩珷鐨勬湅

鍙嬪簲璇ラ兘寰堟竻妤氬皬椹殑鏂瑰紡鍟︼紝鏋滄柇鍏堜笂鏁堟灉锛屽啀涓€姝ユ鍒嗚В浠g爜锛屾潵鍚э紝鏁堟灉鍥惧涓嬶細

涓€锛氭棤澶у皬闄愬埗鐨勭嚎绋嬫睜鎵ц鏁堟灉濡備笅

浜岋細闄愬埗鎸夐『搴忔潵鎵ц浠诲姟鐨勭嚎绋嬫睜鏁堟灉濡備笅

222725754.gif

涓夛細涓€涓竴涓换鍔$殑鎵ц绾跨▼姹犳晥鏋滃涓嬶紙涓庢寜椤哄簭鎵ц鏁堟灉鏄竴鏍风殑锛屽彧鏄唴閮ㄥ疄鐜扮◢鏈変笉鍚岋級

222657697.gif

鍥涳細鎸夋寚瀹氫釜鏁版潵鎵ц浠诲姟鐨勭嚎绋嬫睜鏁堟灉濡備笅

222840612.gif

浜旓細鍒涘缓涓€涓彲鍦ㄦ寚瀹氭椂闂撮噷鎵ц浠诲姟鐨勭嚎绋嬫睜锛屼害鍙噸澶嶆墽琛?涓嶅父鐢紝鏁堟灉涓庡洓鐩稿悓

222856182.gif

鍏細鎸夋寚瀹氬伐鍘傛ā寮忔潵鎵ц鐨勭嚎绋嬫睜锛屾晥鏋滀笌鍥涖€佷簲涓€鏍凤紝浣嗙敤鏂瑰紡鍏垱寤虹殑绾跨▼姹犻兘鏈夊湪宸ュ巶

涓寚瀹氱殑绾跨▼灞炴€э紝姣斿锛氱嚎绋嬪悕瀛椼€佹槸鍚︿负鐢ㄦ埛绾跨▼绛夌瓑灞炴€?/span>

222913795.gif

涓冿細绾跨▼姹犱腑浠诲姟鎵ц鏃跺彲鏆傚仠鏁堟灉鍥惧涓?/span>

222933493.gif

鍏細鐢≧unnable銆丆oncurrentLinkedQueue銆丆oncurrentMap銆丗uture銆丒xecutorService鍏宠仈瀹炵幇鐨勬晥鏋滃浘濡備笅

222950866.gif

鍝︾殑浜嗭紝鏁堟灉鐪嬪畬浜嗭紝鐜板湪灏辫澶у鑷淇敼AndroidManifest.xml涓富Activity鐨勫叆鍙f潵鐪嬩袱绉嶄笉鍚屾柟寮忓疄鐜扮殑浠g爜鏁堟灉鍚э紝棣栧厛锛屽厛璐翠竴涓婱ain.java绫荤殑浠g爜锛屽笇鏈涘ぇ瀹惰缁嗙湅閲岄潰鐨勬敞閲婏紝涓€瀹氳璇︾粏鐪嬶紝浣犱笉浼氬悆浜忕殑锛岀浉淇℃垜锛侊紙澶囨敞锛氫负浜嗗啓鏂囩珷鍔犳敞閲婅繕鏈夋煡鎵剧殑鏃跺€欐柟渚匡紝灏忛┈鎶婃墍鏈夌殑涓荤被鍙婅緟鍔╃被浠ュ唴閮ㄧ被鐨勫舰寮忓啓鍒颁竴涓?java鏂囦欢閲岄潰浜嗭紝濡傛灉鏈嬪弸浠寰楃湅鐫€涔憋紝涓嶇埥鐨勮瘽锛屽彲浠ヨ嚜琛屽皢閲岄潰鐨勭被鎶藉彇鍒板崟鐙殑.java鏂囦欢涓紝鍑犲垎閽熸悶瀹氱殑浜嬶紒锛?/span>

鏂瑰紡涓€锛堢函ExecutorService銆丄syncTask銆丷unnable鍏宠仈瀹炵幇鐩稿叧鏂囦欢濡備笅锛夛細

1.1锛氫富绫绘枃浠?Main.java)

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353/** FileName:  Main.java* CopyRight:  Belong to  <XiaoMaGuo Technologies > own* Description:  <description>* Modify By :  XiaoMaGuo ^_^* Modify Date:   2013-10-15* Follow Order No.:  <Follow Order No.>* Modify Order No.:  <Modify Order No.>* Modify Content:  <modify content >*/package com.xiaoma.threadpooltest;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.os.AsyncTask;import android.os.Build;import android.os.Bundle;import android.os.SystemClock;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.PRogressBar;import android.widget.TextView;import android.widget.Toast;/*** @TODO [The Class File Description]* @author XiaoMaGuo ^_^* @version [version-code, 2013-10-15]* @since [Product/module]*/@TargetApi(Build.VERSION_CODES.HONEYCOMB)public class Main extends Activity{private static int order = 0;/** 鎬诲叡澶氬皯浠诲姟锛堟牴鎹瓹PU涓暟鍐冲畾鍒涘缓娲诲姩绾跨▼鐨勪釜鏁?杩欐牱鍙栫殑濂藉灏辨槸鍙互璁╂墜鏈烘壙鍙楀緱浣忥級 */// private static final int count = Runtime.getRuntime().availableProcessors() * 3 + 2;/** 鎬诲叡澶氬皯浠诲姟锛堟垜鏄湪妯℃嫙鍣ㄩ噷闈㈣窇鐨勶紝涓轰簡鏁堟灉鏄庢樉锛屾墍浠ュ啓姝讳簡涓?0涓紝濡傛灉鍦ㄦ墜鏈轰笂鐨勮瘽锛屾帹鑽愪娇鐢ㄤ笂闈㈢殑閭d釜count锛?*/private static final int count = 10;/** 姣忔鍙墽琛屼竴涓换鍔$殑绾跨▼姹?*/private static ExecutorService singleTaskExecutor = null;/** 姣忔鎵ц闄愬畾涓暟涓换鍔$殑绾跨▼姹?*/private static ExecutorService limitedTaskExecutor = null;/** 鎵€鏈変换鍔¢兘涓€娆℃€у紑濮嬬殑绾跨▼姹?*/private static ExecutorService allTaskExecutor = null;/** 鍒涘缓涓€涓彲鍦ㄦ寚瀹氭椂闂撮噷鎵ц浠诲姟鐨勭嚎绋嬫睜锛屼害鍙噸澶嶆墽琛?*/private static ExecutorService scheduledTaskExecutor = null;/** 鍒涘缓涓€涓彲鍦ㄦ寚瀹氭椂闂撮噷鎵ц浠诲姟鐨勭嚎绋嬫睜锛屼害鍙噸澶嶆墽琛岋紙涓嶅悓涔嬪锛氫娇鐢ㄥ伐绋嬫ā寮忥級 */private static ExecutorService scheduledTaskFactoryExecutor = null;private List<AsyncTaskTest> mTaskList = null;/** 浠诲姟鏄惁琚彇娑?*/private boolean isCancled = false;/** 鏄惁鐐瑰嚮骞跺彇娑堜换鍔℃爣绀虹 */private boolean isClick = false;/** 绾跨▼宸ュ巶鍒濆鍖栨柟寮忎竴 */ThreadFactory tf = Executors.defaultThreadFactory();/** 绾跨▼宸ュ巶鍒濆鍖栨柟寮忎簩 */private static class ThreadFactoryTest implements ThreadFactory{@Overridepublic Thread newThread(Runnable r){Thread thread = new Thread(r);thread.setName("XiaoMaGuo_ThreadFactory");thread.setDaemon(true); // 灏嗙敤鎴风嚎绋嬪彉鎴愬畧鎶ょ嚎绋?榛樿falsereturn thread;}}static{singleTaskExecutor = Executors.newSingleThreadExecutor();// 姣忔鍙墽琛屼竴涓嚎绋嬩换鍔$殑绾跨▼姹?/code>limitedTaskExecutor = Executors.newFixedThreadPool(3);// 闄愬埗绾跨▼姹犲ぇ灏忎负7鐨勭嚎绋嬫睜allTaskExecutor = Executors.newCachedThreadPool(); // 涓€涓病鏈夐檺鍒舵渶澶х嚎绋嬫暟鐨勭嚎绋嬫睜scheduledTaskExecutor = Executors.newScheduledThreadPool(3);// 涓€涓彲浠ユ寜鎸囧畾鏃堕棿鍙懆鏈熸€х殑鎵ц鐨勭嚎绋嬫睜scheduledTaskFactoryExecutor = Executors.newFixedThreadPool(3, new ThreadFactoryTest());// 鎸夋寚瀹氬伐鍘傛ā寮忔潵鎵ц鐨勭嚎绋嬫睜scheduledTaskFactoryExecutor.submit(new Runnable(){@Overridepublic void run(){Log.i("KKK", "This is the ThreadFactory Test  submit Run! ! ! ");}});};@Overridepublic void onCreate(Bundle icicle){super.onCreate(icicle);setContentView(R.layout.demo);final ListView taskList = (ListView)findViewById(R.id.task_list);taskList.setAdapter(new AsyncTaskAdapter(getapplication(), count));taskList.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id){if (position == 0) // 浠ョ涓€椤逛负渚嬶紝鏉ユ祴璇曞叧闂嚎绋嬫睜{/*** 浼氬叧闂嚎绋嬫睜鏂瑰紡涓€锛氫絾涓嶆帴鏀舵柊鐨凾ask,鍏抽棴鍚庯紝姝e湪绛夊緟 鎵ц鐨勪换鍔′笉鍙椾换浣曞奖鍝嶏紝浼氭甯告墽琛?鏃犺繑鍥?#20540;!*/// allTaskExecutor.shutdown();/*** 浼氬叧闂嚎绋嬫睜鏂瑰紡浜岋細涔熶笉鎺ユ敹鏂扮殑Task锛屽苟鍋滄姝g瓑寰呮墽琛岀殑Task锛堜篃灏辨槸璇达紝 鎵ц鍒颁竴鍗婄殑浠诲姟灏嗘甯告墽琛屼笅鍘伙級锛屾渶缁堣繕浼氱粰浣犺繑鍥炰竴涓鍦ㄧ瓑寰呮墽琛屼絾绾跨▼姹犲叧闂嵈娌℃湁琚墽琛岀殑Task闆嗗悎锛?/code>*/List<Runnable> unExecRunn = allTaskExecutor.shutdownNow();for (Runnable r : unExecRunn){Log.i("KKK", "鏈墽琛岀殑浠诲姟淇℃伅锛?" + unExecRunn.toString());}Log.i("KKK", "Is shutdown ? = " + String.valueOf(allTaskExecutor.isShutdown()));allTaskExecutor = null;}// 浠ョ浜岄」涓轰緥鏉ユ祴璇曟槸鍚﹀彇娑堟墽琛岀殑浠诲姟AsyncTaskTest sat = mTaskList.get(1);if (position == 1){if (!isClick){sat.cancel(true);isCancled = true;isClick = !isClick;}else{sat.cancel(false);isCancled = false;// isClick = false;isClick = !isClick;if (null != sat && sat.getStatus() == AsyncTask.Status.RUNNING){if (sat.isCancelled()){sat = new AsyncTaskTest(sat.mTaskItem);}else{Toast.makeText(Main.this, "A task is already running, try later", Toast.LENGTH_SHORT).show();}}/*** 鐢变簬涓婇潰娴嬭瘯鍏抽棴锛屽湪涓嶉噸鏂扮敓鎴恆llTaskExecutor鐨勫悓鏃讹紝浼氭姤寮傚父锛堟病鏈夊彲浠ヤ娇鐢ㄧ殑绾跨▼姹狅紝鏁呮澶勯噸鏂扮敓鎴愮嚎绋嬫睜瀵硅薄锛?/code>*/if (allTaskExecutor == null){allTaskExecutor = Executors.newCachedThreadPool();}sat.executeOnExecutor(allTaskExecutor); // The task is already running(杩欎篃鏄釜寮傚父鍝︼紝灏忓績浣跨敤锛?)}}else{sat.cancel(false);isCancled = false;// sat.execute(sat.mTaskItem);// sat.executeOnExecutor(allTaskExecutor);}}});}/*** @TODO [ListView Item鐨勬潯鐩€傞厤鍣╙* @author XiaoMaGuo ^_^* @version [version-code, 2013-10-22]* @since [Product/module]*/private class AsyncTaskAdapter extends BaseAdapter{private Context mContext;private LayoutInflater mFactory;private int mTaskCount;public AsyncTaskAdapter(Context context, int taskCount){mContext = context;mFactory = LayoutInflater.from(mContext);mTaskCount = taskCount;mTaskList = new ArrayList<AsyncTaskTest>(taskCount);}@Overridepublic int getCount(){return mTaskCount;}@Overridepublic Object getItem(int position){return mTaskList.get(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){if (convertView == null){convertView = mFactory.inflate(R.layout.list_view_item, null);AsyncTaskTest task = new AsyncTaskTest((MyListItem)convertView);/*** 涓嬮潰涓ょ浠诲姟鎵ц鏁堟灉閮戒竴鏍?褰㈠彉璐ㄤ笉鍙?/code>* */// task.execute();// task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);/*** 涓嬮潰鐨勬柟寮忓湪灏忎簬API 11绾ф椂鏁堟灉鏄竴鏍风殑锛屼絾鍦ㄩ珮鐗堟湰涓殑绋嶅井鏈夌偣涓嶅悓,鍙互鐪嬩互涓婣syncTask鏍稿績鍙橀噺鐨勫畾涔夊氨鐭ラ亾浜嗕娇鐢ㄥ涓?/code>* 鏂瑰紡鏃讹紝绯荤粺浼氶粯璁ょ殑閲囩敤浜斾釜涓€缁勶紝浜斾釜涓€缁勭殑鏂瑰紡鏉ユ墽琛屾垜浠殑浠诲姟锛屽畾涔夊湪锛欰syncTask.class涓紝private static final int CORE_POOL_SIZE = 5;* */// use AsyncTask#THREAD_POOL_EXECUTOR is the same to older version #execute() (less than API 11)// but different from newer version of #execute()// task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);/*** 涓€涓竴涓墽琛屾垜浠殑浠诲姟,鏁堟灉涓庢寜椤哄簭鎵ц鏄竴鏍风殑(AsyncTask.SERIAL_EXECUTOR)* */// task.executeOnExecutor(singleTaskExecutor);/*** 鎸夋垜浠寚瀹氱殑涓暟鏉ユ墽琛屼换鍔$殑绾跨▼姹?/code>* */// task.executeOnExecutor(limitedTaskExecutor);/*** 涓嶉檺瀹氭寚瀹氫釜鏁扮殑绾跨▼姹狅紝涔熷氨鏄锛氫綘寰€閲岄潰鏀句簡鍑犱釜浠诲姟锛屼粬鍏ㄩ儴鍚屼竴鏃堕棿寮€濮嬫墽琛岋紝 涓嶇浣犳墜鏈哄彈寰椾簡鍙椾笉浜?/code>* */task.executeOnExecutor(allTaskExecutor);/*** 鍒涘缓涓€涓彲鍦ㄦ寚瀹氭椂闂撮噷鎵ц浠诲姟鐨勭嚎绋嬫睜锛屼害鍙噸澶嶆墽琛?/code>* */// task.executeOnExecutor(scheduledTaskExecutor);/*** 鍒涘缓涓€涓寜鎸囧畾宸ュ巶妯″紡鏉ユ墽琛屼换鍔$殑绾跨▼姹?鍙兘姣旇緝姝h,浣嗕篃涓嶅父鐢?/code>*/// task.executeOnExecutor(scheduledTaskFactoryExecutor);mTaskList.add(task);}return convertView;}}class AsyncTaskTest extends AsyncTask<Void, Integer, Void>{private MyListItem mTaskItem;private String id;private AsyncTaskTest(MyListItem item){mTaskItem = item;if (order < count || order == count){id = "鎵ц:" + String.valueOf(++order);}else{order = 0;id = "鎵ц:" + String.valueOf(++order);}}@Overrideprotected void onPreExecute(){mTaskItem.setTitle(id);}/*** Overriding methods*/@Overrideprotected void onCancelled(){super.onCancelled();}@Overrideprotected Void doInVoid...  params){if (!isCancelled() && isCancled == false) // 杩欎釜鍦版柟寰堝叧閿紝濡傛灉涓嶈缃爣蹇椾綅鐨勮瘽锛岀洿鎺etCancel锛坱rue锛夋槸鏃犳晥鐨?/code>{int prog = 0;/*** 涓嬮潰鐨剋hile涓紝灏忛┈鍐欎簡涓垎鏀敤鏉ュ仛涓亣璞★紙浠诲姟涓滆タ鍒氬紑濮嬩笅杞界殑鏃跺€欙紝閫熷害蹇紝蹇笅杞藉畬鎴愮殑鏃跺€欏氨绐佺劧闂存參浜嗕笅鏉ョ殑鏁堟灉锛?澶у鍙互鎯宠薄涓€涓嬶紝绫?#20284;* 锛歅P鎵嬫満鍔╂墜銆?1鎵嬫満鍔╂墜涓垨鍏跺畠鎵嬫満搴旂敤涓紝鍑犱箮閮芥湁杩欎釜鍋囪薄锛屽紑濮嬪揩锛岀粨鏉熸椂灏变笅杞藉彉鎱簡锛岃鐧戒簡 灏辨槸寮€鍙戠殑浜轰笉鎯宠浣犲湪涓嬭浇鍒板ぇ浜庝竴鍗婄殑鏃跺€欙紝涔熷氨鏄揩涓嬭浇瀹岀殑鏃跺€欏幓鐐瑰彇娑堬紝浣犻偅鏍峰緱澶氭氮璐?/code>* 锛佹墍浠ラ€犱釜鍋囪薄锛岃浣犱笉鎯冲幓鍙栨秷鑰屽凡锛?/code>*/while (prog < 101){if ((prog > 0 || prog == 0) && prog < 70) // 灏忎簬70%鏃讹紝鍔犲揩杩涘害鏉℃洿鏂?/code>{SystemClock.sleep(100);}else// 澶т簬70%鏃讹紝鍑忔參杩涘害鏉℃洿鏂?/code>{SystemClock.sleep(300);}publishProgress(prog); // 鏇存柊杩涘害鏉?/code>prog++;}}return null;}@Overrideprotected void onPostExecute(Void result){}@Overrideprotected void onProgressUpdate(Integer... values){mTaskItem.setProgress(values[0]); // 璁剧疆杩涘害}}}/*** @TODO [涓€涓畝鍗曠殑鑷畾涔?ListView Item]* @author XiaoMaGuo ^_^* @version [version-code, 2013-10-22]* @since [Product/module]*/class MyListItem extends LinearLayout{private TextView mTitle;private ProgressBar mProgress;public MyListItem(Context context, AttributeSet attrs){super(context, attrs);}public MyListItem(Context context){super(context);}public void setTitle(String title){if (mTitle == null){mTitle = (TextView)findViewById(R.id.task_name);}mTitle.setText(title);}public void setProgress(int prog){if (mProgress == null){mProgress = (ProgressBar)findViewById(R.id.task_progress);}mProgress.setProgress(prog);}}

1.2锛氬竷灞€鏂囦欢

123456789101112131415<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="10dip"android:paddingRight="10dip"android:orientation="vertical" ><ListView android:id="@+id/task_list"android:layout_width="fill_parent"android:layout_height="wrap_content"android:divider="#cccccc"android:dividerHeight="0.6dip"android:footerDividersEnabled="true"android:headerDividersEnabled="true" /></LinearLayout>

鏂瑰紡浜岋紙Runnable銆丆oncurrentLinkedQueue銆丆oncurrentMap銆丗uture銆丒xecutorService鍏宠仈瀹炵幇鐨勭浉鍏虫枃浠跺涓嬶級锛?/span>

2.1:涓荤被鏂囦欢(MyRunnableActivity.java)

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320/** FileName:  MyRunnableActivity.java* CopyRight:  Belong to  <XiaoMaGuo Technologies > own* Description:  <description>* Modify By :  XiaoMaGuo ^_^* Modify Date:   2013-10-21* Follow Order No.:  <Follow Order No.>* Modify Order No.:  <Modify Order No.>* Modify Content:  <modify content >*/package com.xiaoma.threadpooltest;import java.util.Iterator;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.ProgressBar;import android.widget.Toast;/*** @TODO [绾跨▼姹犳帶鍒?]* @author XiaoMaGuo ^_^* @version [version-code, 2013-10-22]* @since [Product/module]*/public class MyRunnableActivity extends Activity implements OnClickListener{/** 浠诲姟鎵ц闃熷垪 */private ConcurrentLinkedQueue<MyRunnable> taskQueue = null;/*** 姝e湪绛夊緟鎵ц鎴栧凡缁忓畬鎴愮殑浠诲姟闃熷垪** 澶囨敞锛欶uture绫伙紝涓€涓敤浜庡瓨鍌ㄥ紓姝ヤ换鍔℃墽琛岀殑缁撴灉锛屾瘮濡傦細鍒ゆ柇鏄惁鍙栨秷銆佹槸鍚﹀彲浠ュ彇娑堛€佹槸鍚︽鍦ㄦ墽琛屻€佹槸鍚﹀凡缁忓畬鎴愮瓑** */private ConcurrentMap<Future, MyRunnable> taskMap = null;/*** 鍒涘缓涓€涓笉闄愬埗澶у皬鐨勭嚎绋嬫睜 姝ょ被涓昏鏈変互涓嬪ソ澶?1锛屼互鍏变韩鐨勬棤鐣岄槦鍒楁柟寮忔潵杩愯杩欎簺绾跨▼. 2锛屾墽琛屾晥鐜囬珮銆?3锛屽湪浠绘剰鐐癸紝鍦ㄥぇ澶氭暟 nThreads 绾跨▼浼氬浜庡鐞嗕换鍔$殑娲诲姩鐘舵€?/code>* 4锛屽鏋滃湪鍏抽棴鍓嶇殑鎵ц鏈熼棿鐢变簬澶辫触鑰屽鑷翠换浣曠嚎绋嬬粓姝紝閭d箞涓€涓柊绾跨▼灏嗕唬鏇垮畠鎵ц鍚庣画鐨勪换鍔★紙濡傛灉闇€瑕侊級銆?/code>** */private ExecutorService mES = null;/** 鍦ㄦ绫讳腑浣跨敤鍚屾閿佹椂浣跨敤濡備笅lock瀵硅薄鍗冲彲锛屽畼鏂规帹鑽愮殑锛屼笉鎺ㄨ崘鐩存帴浣跨敤MyRunnableActivity.this绫诲瀷鐨?鍙互璇︾粏璇讳竴涓?framework/app涓嬮潰鐨勯殢渚夸竴涓」鐩?*/private Object lock = new Object();/** 鍞ら啋鏍囧織锛屾槸鍚﹀敜閱掔嚎绋嬫睜宸ヤ綔 */private boolean isNotify = true;/** 绾跨▼姹犳槸鍚﹀浜庤繍琛岀姸鎬?鍗?鏄惁琚噴鏀?) */private boolean isRuning = true;/** 浠诲姟杩涘害 */private ProgressBar pb = null;/** 鐢ㄦHandler鏉ユ洿鏂版垜浠殑UI */private Handler mHandler = null;/*** Overriding methods** @param savedInstanceState*/@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.my_runnable_main);init();}public void init(){pb = (ProgressBar)findViewById(R.id.progressBar1);findViewById(R.id.button1).setOnClickListener(this);findViewById(R.id.button2).setOnClickListener(this);findViewById(R.id.button3).setOnClickListener(this);findViewById(R.id.button4).setOnClickListener(this);findViewById(R.id.button5).setOnClickListener(this);taskQueue = new ConcurrentLinkedQueue<MyRunnable>();taskMap = new ConcurrentHashMap<Future, MyRunnable>();if (mES == null){mES = Executors.newCachedThreadPool();}// 鐢ㄤ簬鏇存柊ProgressBar杩涘害鏉?/code>mHandler = new Handler(){/*** Overriding methods** @param msg*/@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);pb.setProgress(msg.what);}};}/*** Overriding methods** @param v*/@Overridepublic void onClick(View v){switch (v.getId()){case R.id.button1:start();break;case R.id.button2:stop();break;case R.id.button3:reload(new MyRunnable(mHandler));break;case R.id.button4:release();break;case R.id.button5:addTask(new MyRunnable(mHandler));break;default:break;}}/*** <Summary Description>*/private void addTask(final MyRunnable mr){mHandler.sendEmptyMessage(0);if (mES == null){mES = Executors.newCachedThreadPool();notifyWork();}if (taskQueue == null){taskQueue = new ConcurrentLinkedQueue<MyRunnable>();}if (taskMap == null){taskMap = new ConcurrentHashMap<Future, MyRunnable>();}mES.execute(new Runnable(){@Overridepublic void run(){/*** 鎻掑叆涓€涓猂unnable鍒颁换鍔¢槦鍒椾腑 杩欎釜鍦版柟瑙i噴涓€涓?offer璺焌dd鏂规硶,璇曚簡涓?鏁堟灉閮戒竴鏍?娌″尯鍒?瀹樻柟鐨勮В閲婂涓? 1 offer : Inserts the specified* element at the tail of this queue. As the queue is unbounded, this method will never return* {@code false}. 2 add: Inserts the specified element at the tail of this queue. As the queue is* unbounded, this method will never throw {@link IllegalStateException} or return {@code false}.*** */taskQueue.offer(mr);// taskQueue.add(mr);notifyWork();}});Toast.makeText(MyRunnableActivity.this, "宸叉坊鍔犱竴涓柊浠诲姟鍒扮嚎绋嬫睜涓?锛?quot;, 0).show();}/*** <Summary Description>*/private void release(){Toast.makeText(MyRunnableActivity.this, "閲婃斁鎵€鏈夊崰鐢ㄧ殑璧勬簮锛?quot;, 0).show();/** 灏哖rogressBar杩涘害缃负0 */mHandler.sendEmptyMessage(0);isRuning = false;Iterator iter = taskMap.entrySet().iterator();while (iter.hasNext()){Map.Entry<Future, MyRunnable> entry = (Map.Entry<Future, MyRunnable>)iter.next();Future result = entry.getKey();if (result == null){continue;}result.cancel(true);taskMap.remove(result);}if (null != mES){mES.shutdown();}mES = null;taskMap = null;taskQueue = null;}/*** <Summary Description>*/private void reload(final MyRunnable mr){mHandler.sendEmptyMessage(0);if (mES == null){mES = Executors.newCachedThreadPool();notifyWork();}if (taskQueue == null){taskQueue = new ConcurrentLinkedQueue<MyRunnable>();}if (taskMap == null){taskMap = new ConcurrentHashMap<Future, MyRunnable>();}mES.execute(new Runnable(){@Overridepublic void run(){/** 鎻掑叆涓€涓猂unnable鍒颁换鍔¢槦鍒椾腑 */taskQueue.offer(mr);// taskQueue.add(mr);notifyWork();}});mES.execute(new Runnable(){@Overridepublic void run(){if (isRuning){MyRunnable myRunnable = null;synchronized (lock){myRunnable = taskQueue.poll(); // 浠庣嚎绋嬮槦鍒椾腑鍙栧嚭涓€涓猂unnable瀵硅薄鏉ユ墽琛岋紝濡傛灉姝ら槦鍒椾负绌猴紝鍒欒皟鐢╬oll()鏂规硶浼氳繑鍥瀗ullif (myRunnable == null){isNotify = true;}}if (myRunnable != null){taskMap.put(mES.submit(myRunnable), myRunnable);}}}});}/*** <Summary Description>*/private void stop(){Toast.makeText(MyRunnableActivity.this, "浠诲姟宸茶鍙栨秷锛?quot;, 0).show();for (MyRunnable runnable : taskMap.values()){runnable.setCancleTaskUnit(true);}}/*** <Summary Description>*/private void start(){if (mES == null || taskQueue == null || taskMap == null){Log.i("KKK""鏌愯祫婧愭槸涓嶆槸宸茬粡琚噴鏀句簡锛?quot;);return;}mES.execute(new Runnable(){@Overridepublic void run(){if (isRuning){MyRunnable myRunnable = null;synchronized (lock){myRunnable = taskQueue.poll(); // 浠庣嚎绋嬮槦鍒椾腑鍙栧嚭涓€涓猂unnable瀵硅薄鏉ユ墽琛岋紝濡傛灉姝ら槦鍒椾负绌猴紝鍒欒皟鐢╬oll()鏂规硶浼氳繑鍥瀗ullif (myRunnable == null){isNotify = true;// try// {// myRunnable.wait(500);// }// catch (InterruptedException e)// {// e.printStackTrace();// }}}if (myRunnable != null){taskMap.put(mES.submit(myRunnable), myRunnable);}}}});}private void notifyWork(){synchronized (lock){if (isNotify){lock.notifyAll();isNotify = !isNotify;}}}}

2.2:杈呭姪绫伙紙MyRunnable.java锛?/span>

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101/** FileName:  MyRunnable.java* CopyRight:  Belong to  <XiaoMaGuo Technologies > own* Description:  <description>* Modify By :  XiaoMaGuo ^_^* Modify Date:   2013-10-21* Follow Order No.:  <Follow Order No.>* Modify Order No.:  <Modify Order No.>* Modify Content:  <modify content >*/package com.xiaoma.threadpooltest;import android.os.Handler;import android.os.SystemClock;import android.util.Log;/*** @TODO [The Class File Description]* @author XiaoMaGuo ^_^* @version [version-code, 2013-10-21]* @since [Product/module]*/public class MyRunnable implements Runnable{private boolean cancleTask = false;private boolean cancleException = false;private Handler mHandler = null;public MyRunnable(Handler handler){mHandler = handler;}/*** Overriding methods*/@Overridepublic void run(){Log.i("KKK", "MyRunnable  run() is executed!!! ");runBefore();if (cancleTask == false){running();Log.i("KKK", "璋冪敤MyRunnable run()鏂规硶");}runAfter();}/*** <Summary Description>*/private void runAfter(){Log.i("KKK", "runAfter()");}/*** <Summary Description>*/private void running(){Log.i("KKK", "running()");try{// 鍋氱偣鏈夊彲鑳戒細鍑哄紓甯哥殑浜嬫儏锛侊紒锛?/code>int prog = 0;if (cancleTask == false && cancleException == false){while (prog < 101){if ((prog > 0 || prog == 0) && prog < 70){SystemClock.sleep(100);}else{SystemClock.sleep(300);}if (cancleTask == false){mHandler.sendEmptyMessage(prog++);Log.i("KKK", "璋冪敤 prog++ = " + (prog));}}}}catch (Exception e){cancleException = true;}}/*** <Summary Description>*/private void runBefore(){// TODO Auto-generated method stubLog.i("KKK""runBefore()");}public void setCancleTaskUnit(boolean cancleTask){this.cancleTask = cancleTask;Log.i("KKK""鐐瑰嚮浜嗗彇娑堜换鍔℃寜閽? 锛侊紒锛?quot;);// mHandler.sendEmptyMessage(0);}}

2.3:甯冨眬鏂囦欢

123456789101112131415161718192021222324252627282930313233343536373839404142<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><Buttonandroid:id="@+id/button5"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="娣诲姞浠诲姟" /><Buttonandroid:id="@+id/button1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="寮€濮嬩换鍔?quot; /><Buttonandroid:id="@+id/button2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="鍙栨秷浠诲姟" /><Buttonandroid:id="@+id/button3"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="閲嶆柊鍔犺浇" /><Buttonandroid:id="@+id/button4"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="閲婃斁璧勬簮" /></LinearLayout><include layout="@layout/my_runnable_merge"/></LinearLayout>

鏂瑰紡涓€銆佹柟寮忎簩鐨勫叏灞€閰嶇疆鏂囦欢AndroidManifest.xml鏂囦欢鐨勯厤缃涓嬶細

12345678910111213141516171819202122232425262728293031<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xiaoma.threadpooltest"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/APPTheme" ><activityandroid:name="Main"android:label="@string/app_name" ><!--             <intent-filter> --><!--                 <action android:name="android.intent.action.MAIN" /> --><!--                 <category android:name="android.intent.category.LAUNCHER" /> --><!--             </intent-filter> --></activity><activityandroid:name="MyRunnableActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

濂戒簡锛屼粖澶╄鍐欏唴瀹癸紝澶т綋灏辨槸杩欎簺浜嗭紝椤圭洰鐨勬簮鐮佸ぇ瀹跺彲浠ュ埌闄勪欢涓笅杞斤紝濡傛灉鑳戒粩缁嗙殑灏嗕笂闈㈢殑涓滆タ閮界湅瀹屽苟娑堝寲鐨勮瘽锛岀嚎绋嬫睜鏂归潰鐨勪笢瑗垮彲鑳戒互鍚庡苟涓嶄細澶繃涓洪毦浣犲暒锛佸懙鍛碉紝褰撶劧浜嗭紝灏忛┈杩欎簺浠g爜涓啓鐨勯兘鏄竴浜涙瘮杈冪畝鍗曠殑鍐欐硶锛?/span>浠呬粎鏄娇鐢ㄤ簡鍦ㄧ嚎绋嬩腑浼戠湢鐨勬柟寮忔潵妯℃嫙缃戠粶涓嬭浇锛堣繕鏄釜鍋囪薄锛夛紝濡傛灉鍦ㄥ疄闄呬唬鐮佷腑浣跨敤鏃讹紝灏ゅ叾鍦ㄩ噴鏀捐祫婧愯繖涓€鍧楋紝涓嶈鍙槸鍗曞崟閲婃斁浜嗘垜浠嚜宸辨帶鍒剁殑绾跨▼姹犲強鍏朵换鍔★紝杩樿灏嗙綉缁滆姹傜殑Http涔熶竴鍚岄攢姣佹帀鍝︼紝杩欐牱鎵嶇畻鍋氬埌浜嗗畬缇庯紒鎬ユ€ュ繖蹇欏啓鐨勶紝濡傛灉鏂囩珷涓湁浠€涔堝湴鏂瑰啓鐨勪笉瀵圭殑锛岀湡鐨勫緢甯屾湜Android鑰侀笩銆佽彍楦熼兘鏉ユ寚鐐广€佹彁闂紝浠g爜涓嫢涓嶅鐨勶紝鎴栦笉澶悎鐞嗙殑鍦版柟锛屾湁鏈嬪弸鍙戣浜嗚繕璇峰強鏃舵壒璇勬寚姝o紒灏忛┈鍏堝湪姝よ阿璋㈠ぇ瀹跺暒锛佸姞娌癸紝姣忓ぉ杩涙涓€鐐癸紝鍧氭寔鎬讳細鏈夋敹鑾风殑锛佸簾璇濅笉澶氳浜嗭紝澶у鏅氬畨锛佲€_O鈥?/span>

涓€涓緢骞哥鐨勫潖浜猴紒灏忛┈鏋溿€侀叿_鑾悕绠€鍗?/span>

鏈枃鍑鸿嚜 鈥?a target="_blank" href="http://mzh3344258.blog.51cto.com/" style="padding:0px; margin:0px; color:rgb(75,0,2); text-decoration:none">閰穇鑾悕绠€鍗曘€並Nothing鈥?鍗氬锛岃鍔″繀淇濈暀姝ゅ嚭澶?a target="_blank" href="http://mzh3344258.blog.51cto.com/1823534/1313611" style="padding:0px; margin:0px; color:rgb(75,0,2); text-decoration:none">http://mzh3344258.blog.51cto.com/1823534/1313611


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表