1. 主页 > 好文章

Java线程创建步骤与场景应用:Thread Runnable Callable使用指南

涓轰粈涔堝埆浜虹殑绋嬪簭璺戝緱椋炲揩锛屼綘鐨勫嵈鍗℃垚骞荤伅鐗囷紵馃 澶氬崐鏄病鐢ㄥソ澶氱嚎绋嬶紒浠婂ぉ鍜变滑灏辩敤澶х櫧璇濇媶瑙ava绾跨▼涓夊ぇ娉曞疂鈥斺€擳hread銆丷unnable銆丆allable锛屼繚鍑嗕綘鐪嬪畬灏辫兘鍔ㄦ墜鍐欙紒


馃攳 鍏堟悶鎳傚熀纭€锛氱嚎绋嬫槸涓粈涔堥锛?/h2>

涓句釜鏍楀瓙馃尠锛屼綘鎵撳紑鎵嬫満鐐瑰鍗栵紝鍚庡彴鍚屾椂瑕佸鐞嗕綘鐨勫畾浣嶃€佸埛鏂板晢瀹跺垪琛ㄣ€佸姞杞戒績閿€娲诲姩銆傚鏋滆繖浜涗簨閮芥帓鐫€闃熷仛锛屼綘鏃╅タ鏅曞湪娌欏彂涓婁簡瀵瑰惂锛熺嚎绋嬪氨鏄绋嬪簭鑳?涓€蹇冨鐢?鐨勭鍣紒

浣咼ava涓哄暐瑕佹悶涓夌鍒涘缓鏂瑰紡锛熻繖灏卞ソ姣斿悆楗湁绛峰瓙銆佸弶瀛愩€佸嫼瀛愶紝涓嶅悓鍦哄悎鐢ㄤ笉鍚屽伐鍏峰槢銆傚挶浠厛鏉ヨ璇嗕笅涓変綅涓昏锛?/p>

Thread澶у摜Runnable浜屽摜Callable涓夊紵
鈥?strong>鈥嬬壒闀库€?/strong>鈥?/td>绠€鍗曠矖鏆?/td>鐏垫椿澶嶇敤鑳藉甫杩斿洖鍊?/td>
鈥?strong>鈥嬬己鐐光€?/strong>鈥?/td>涓嶈兘澶氱户鎵?/td>娌℃湁杩斿洖鍊?/td>鐢ㄨ捣鏉ョ暐楹荤儲
鈥?strong>鈥嬩娇鐢ㄥ満鏅€?/strong>鈥?/td>蹇€熼獙璇佷唬鐮?/td>瀹為檯椤圭洰棣栭€?/td>闇€瑕佺粨鏋滃弽棣?/td>

馃殌 Thread鍏ラ棬锛氫粠"Hello World"寮€濮?/h2>

鏂版墜鏈€鐖辩敤Thread锛屼负鍟ワ紵鍥犱负绠€鍗曞晩锛佸挶浠厛鐪嬫浠g爜鐑儹韬細

java澶嶅埗
class MyThread extends Thread {
    public void run() {
        System.out.println("鎴戝湪鏂扮嚎绋嬮噷鎾掓鍛綖");
    }
}

// 浣跨敤濮垮娍
MyThread myThread = new MyThread();
myThread.start();

鈿狅笍娉ㄦ剰鍟︼紒杩欓噷鏈変釜鍧戯細鍗冧竾鈥?strong>鈥嬪埆鐩存帴璋冪敤run()鈥?/strong>鈥嬶紒灏卞儚浣犱拱浜嗙摱鍙箰锛屽緱鎷夊紑鎷夌幆锛坰tart()锛夋墠鑳藉枬锛岀洿鎺ュ€掞紙run()锛夊氨娲掍竴韬簡锛?/p>

浣嗛棶棰樻潵浜?..瑕佹槸鎴戠殑绫诲凡缁忕户鎵夸簡鍏朵粬绫绘€庝箞鍔烇紵Java鍙槸鍗曠户鎵跨殑锛佽繖鏃跺€欏氨璇unnable鐧诲満浜嗭紒


馃洜锔?Runnable瀹炴垬锛氶」鐩腑鐨勪竾閲戞补

鏈€杩戝府鏈嬪弸鏀逛簡涓笅杞藉櫒椤圭洰锛屽師鏈敤Thread鍐欑殑锛岀粨鏋滆鍔犺繘搴︽潯鍔熻兘鏃跺氨鍗″3浜嗏€斺€斿凡缁忕户鎵夸簡涓嬭浇绫伙紝娌℃硶鍐嶇户鎵縏hread銆傛敼鐢≧unnable鍚庤眮鐒跺紑鏈楋細

java澶嶅埗
class DownloadTask implements Runnable {
    public void run() {
        System.out.println("姝e湪涓嬭浇...");
        // 鍋囪杩欓噷鏈変笅杞介€昏緫
    }
}

// 鍚姩鏂瑰紡
new Thread(new DownloadTask()).start();

馃挕鈥?strong>鈥嬮噸瑕佸彂鐜扳€?/strong>鈥嬶細鍚屼竴涓猂unnable瀵硅薄鍙互缁欏涓嚎绋嬬敤锛佽繖鍦ㄩ渶瑕佸叡浜祫婧愭椂鐗瑰埆鏈夌敤銆傛瘮濡傛姠绁ㄧ郴缁燂紝鎵€鏈夌獥鍙o紙绾跨▼锛夐兘澶勭悊鍚屼竴涓エ鍔$郴缁燂紙Runnable锛夌殑鏁版嵁銆?/p>

浣嗘湁浜涘悓瀛﹁闂簡锛?鎴戞兂瑕佺嚎绋嬪共瀹屾椿缁欐垜涓粨鏋滃拫鏁达紵" 杩欏氨寰楄鍑?..


馃挵 Callable缁濇椿锛氬甫鐫€杩斿洖鍊煎洖瀹?/h2>

鍘诲勾鍋氱數鍟嗕績閿€绯荤粺锛岄渶瑕佺粺璁℃瘡涓晢鍝佺殑绉掓潃鎯呭喌銆傜敤Callable鐨凢uture妯″紡绠€鐩翠笉瑕佸お鐖斤細

java澶嶅埗
Callable task = () -> {
    // 鍋囪杩欓噷鏈夊鏉傜殑璁$畻
    return 42; // 瀹囧畽缁堟瀬绛旀
};

FutureTask future = new FutureTask<>(task);
new Thread(future).start();

// 绛夌粨鏋滄椂鐨勫Э鍔?/span>
while(!future.isDone()) {
    System.out.println("鑰佹澘姝e湪鍔姏璁$畻...");
}
System.out.println("鏈€缁堢粨鏋滐細" + future.get());

馃晵杩欓噷鏈変釜琛€娉暀璁細future.get()浼氶樆濉炰富绾跨▼锛佸氨鍍忕瓑澶栧崠鏃舵姝荤洴鐫€鎵嬫満锛屼笉濡傚厛鍘诲共鐐瑰埆鐨勩€傝繖鏃跺€欏氨瑕侀厤鍚堢嚎绋嬫睜浣跨敤浜?..


馃 绾跨▼姹狅細涓撲笟鍥㈤槦鐨勬墦寮€鏂瑰紡

璇村埌绾跨▼姹狅紝寰堝鏂版墜閮藉彂鎬点€傚埆鎬ョ潃鍏抽〉闈紝鍜变滑杩欏氨鏉ユ媶瑙h繖涓鍣紒浠ュ鐞?0涓囨潯鏁版嵁涓轰緥锛?/p>

java澶嶅埗
ExecutorService pool = Executors.newFixedThreadPool(5); // 5浜哄皬鍒嗛槦

List> results = new ArrayList<>();
for(int i=0; i<10; i++){
    Callable task = new DataProcessor(i);
    results.add(pool.submit(task));
}

// 鍏抽棴濮垮娍瑕佷紭闆?/span>
pool.shutdown();
while(!pool.awaitTermination(1, TimeUnit.SECONDS)){
    System.out.println("杩樻湁灏忎紮浼村湪鍔犵彮...");
}

涓婁釜鏈堢敤杩欎釜鏂规鏀归€犱簡鍏徃鐨勬姤琛ㄧ郴缁燂紝澶勭悊閫熷害浠庡師鏉ョ殑2灏忔椂鐩存帴鍘嬬缉鍒?5鍒嗛挓锛佽€佹澘鐪嬫垜鐨勭溂绁為兘甯︾潃鍏夆湪


馃З 閬垮潙鎸囧崡锛氭柊鎵嬪父瑙佺炕杞︾幇鍦?/h2>
  1. 鈥?strong>鈥嬬嚎绋嬪畨鍏ㄩ棶棰樷€?/strong>鈥嬶細灏卞儚澶氫汉鍚屾椂缂栬緫鏂囨。锛屼笉鍔犻攣灏变細涔卞銆傝寰楃敤synchronized鎴栬€匧ock
  2. 鈥?strong>鈥嬪唴瀛樻硠婕忊€?/strong>鈥嬶細绾跨▼鐢ㄥ畬涓嶅叧锛熺瓑鐫€绋嬪簭鍙樿湕鐗涘惂馃悓
  3. 鈥?strong>鈥嬭繃搴﹀垱寤虹嚎绋嬧€?/strong>鈥嬶細寮€1000涓嚎绋嬶紵浣犲綋CPU鏄秴绠楀晩锛佸悎鐞嗕娇鐢ㄧ嚎绋嬫睜鎵嶆槸鐜嬮亾

鏈€杩憆eview鏂颁汉浠g爜锛屽彂鐜颁釜鍏稿瀷閿欒锛氬湪寰幆閲岀柉鐙俷ew Thread()锛岀粨鏋滅▼搴忚窇鐫€璺戠潃灏卞唴瀛樻孩鍑轰簡銆傛敼鐢ㄧ嚎绋嬫睜鍚庯紝鍐呭瓨鍗犵敤鐩存帴闄嶄簡70%锛?/p>


馃寛 鐙瑙佽В锛氭垜鐨勮俯鍧戞棩璁?/h2>

鍦ㄧ墿娴佺郴缁熼」鐩腑锛屽彂鐜颁釜鏈夎叮鐜拌薄锛氫娇鐢≧unnable+绾跨▼姹犵殑鏂规锛屾瘮绾敤Thread蹇簡3鍊嶄笉姝紒鏇寸粷鐨勬槸锛屽綋鎶婃牳蹇冪嚎绋嬫暟璁剧疆涓篊PU鏍告暟+1鏃讹紙鎴戜滑鏈嶅姟鍣ㄦ槸8鏍革級锛屽悶鍚愰噺杈惧埌鏈€浣崇姸鎬併€?/p>

杩樻湁涓喎鐭ヨ瘑锛欽ava8鐨凜ompletableFuture鍏跺疄搴曞眰鐢ㄧ殑灏辨槸Callable锛佽繖鐜╂剰澶勭悊寮傛浠诲姟绠€鐩村紑鎸傦紝涓嬫鍙互鍗曠嫭鑱婅亰锝?/p>

璇村埌搴曪紝閫夊摢绉嶆柟寮忓氨鍍忛€変氦閫氬伐鍏凤細鍘绘ゼ涓嬪彇蹇€掗獞鍏变韩鍗曡溅锛圱hread锛夊氨琛岋紝璺ㄥ煄杩愯緭灏卞緱鎵剧墿娴佽溅闃燂紙绾跨▼姹狅級銆傛帉鎻¤繖浜涢棬閬擄紝浣犱篃鑳藉啓鍑鸿窇寰楅璧风殑绋嬪簭锛?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载