Java澶氱嚎绋嬪涔犳€荤粨涔?--澶氱嚎绋嬪熀纭€

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java澶氱嚎绋嬪涔犳€荤粨涔?--澶氱嚎绋嬪熀纭€相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/div' title='div'>div   鍒涘缓   method   run鏂规硶   娌℃湁   status   骞跺彂缂栫▼   鏂规硶   ati   

1銆佺嚎绋嬬浉鍏虫蹇?/strong>

銆€銆€1锛夈€佺嚎绋嬩笌杩涚▼鐨勫尯鍒?/p>

銆€銆€銆€銆€绾跨▼鏄搷浣滅郴缁熻皟搴︾殑鏈€灏忓崟鍏冿紝涔熷彨杞婚噺绾ц繘绋嬶紝鑰岃繘绋嬫槸鎿嶄綔绯荤粺涓殑搴旂敤绋嬪簭锛屽湪杩涚▼涓彲浠ュ垱寤哄涓嚎绋嬨€?/p>

銆€銆€2锛夈€佷笂涓嬫枃鍒囨崲 

銆€銆€銆€銆€鎴戜滑鐭ラ亾鐜颁唬澶勭悊鍣ㄩ兘鏄鏍哥殑锛屽嚑鏍稿鐞嗗櫒鍙兘鍚屾椂澶勭悊鍑犱釜绾跨▼锛屽绾跨▼鎵ц绋嬪簭鐪嬭捣鏉ユ槸鍚屾椂杩涜锛屽疄闄呬笂鏄疌PU鍦ㄥ涓嚎绋嬩箣闂村揩閫熷垏鎹㈡墽琛岋紝杩欎腑闂村氨娑夊強鍒颁笂涓嬮棶鍒囨崲锛屾墍璋撶殑涓婁笅鏂囧垏鎹㈠氨鏄寚涓€涓嚎绋婽琚垎閰嶇殑鏃堕棿鐗囩敤瀹屼簡涔嬪悗锛岀嚎绋嬬殑淇℃伅琚繚瀛樿捣鏉ワ紝CPU鎵ц鍙﹀鐨勭嚎绋嬶紝鍐嶅埌CPU璇诲彇绾跨▼T鐨勪俊鎭苟缁х画鎵цT鐨勮繃绋嬨€?/p>

2銆佺嚎绋嬪疄鐜版柟寮?/strong>

銆€銆€1)銆佺户鎵縏hread绫?/p>

銆€銆€銆€銆€鐢变簬绫荤殑鍗曠户鎵挎€э紝浣跨敤杩欑鏂瑰紡瀹炵幇灏辨棤娉曞啀鍘荤户鎵垮叾浠栫殑绾跨▼锛屾湁灞€闄愶紝鑰﹀悎搴﹂珮銆傘€€

public class MyThread extends Thread{

    @Override
    public void run() {
        super.run();
        System.out.println("鎴戠户鎵夸簡Thread绫?..");
    }
}

銆€銆€2)銆佸疄鐜癛unnable鎺ュ彛

銆€銆€銆€銆€澶у鏁伴兘鐢ㄨ繖绉嶆柟寮忓疄鐜帮紝寰堢伒娲伙紝閲嶅啓run()鏂规硶鍗冲彲锛宺un() 鏂规硶娌℃湁杩斿洖鍊笺€?/p>

銆€銆€3)銆佸疄鐜癈allable鎺ュ彛

銆€銆€銆€銆€鑻ユ槸鎯宠幏鍙栧埌绾跨▼鐨勬墽琛岀粨鏋滐紝閭e氨鐢ㄨ繖绉嶆柟寮忥紝瀹冨拰瀹炵幇Runnable鎺ュ彛鐨勫尯鍒槸瑕侀噸鍐檆all()鏂规硶锛宑all()鏂瑰紡鏄湁杩斿洖鍊肩殑锛岃繑鍥炵殑Object鏄换鍔$殑鎵ц缁撴灉锛屽彲浠ョ敤Future鎺ュ彛鐨勫疄鐜扮被FutureTask鏉ユ帴鏀讹紝骞惰皟鐢╣et()鏂规硶鑾峰彇鍒版墽琛岀粨鏋溿€傚彟澶朿all()鏂规硶鍙姏鍑哄紓甯革紝鑰宺un()鏂规硶鏄笉鑳芥姏鍑哄紓甯哥殑

public class Test {
    public static void main(String[] args) throws Exception {
        Thread thread1 = new MyThread();
        thread1.start();

        Thread thread2 = new Thread(new MyRunnable());
        thread2.start();

        Callable callable = new MyCallable();
        FutureTask<String> future = new FutureTask<>(callable);
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(future);
        System.out.println(future.get());
        executorService.shutdown();
    }

    static class MyRunnable implements Runnable{

        @Override
        public void run() {
            System.out.println("鎴戝疄鐜颁簡Runnable鎺ュ彛...");
        }
    }

    static class MyCallable implements Callable{

        @Override
        public String call() throws Exception {
            return "鎴戝疄鐜颁簡Callable鎺ュ彛...";
        }
    }
}

鎵ц缁撴灉锛?br>銆€銆€
鎴戠户鎵夸簡Thread绫?..
鎴戝疄鐜颁簡Runnable鎺ュ彛...
鎴戝疄鐜颁簡Callable鎺ュ彛...

3銆佺嚎绋嬬姸鎬?nbsp;

銆€銆€鏍规嵁jdk涓璗hread绫荤殑State鍐呴儴绫伙紝绾跨▼鏈?绉嶇姸鎬侊紝涓嬫闈㈣瘯瀹橀棶浣犵嚎绋嬫湁鍑犵鐘舵€侊紝浣犲彲浠ュ緢鏈夊簳姘旂殑鍥炵瓟锛?绉嶏紝濡備笅宸﹀浘锛屽彸鍥炬槸绾跨▼鐘舵€佷箣闂寸殑杞崲銆?/p>

       鎶€鏈垎浜浘鐗? src=                  鎶€鏈垎浜浘鐗? src=

 杩欓噷娉ㄦ剰锛氱嚎绋嬪湪绛夊緟杩涘叆synchronzed鏂规硶鎴栬€卻ynchronized鍧楁椂鐨勭嚎绋嬬姸鎬佹椂BLOCKED锛岃€屽湪绛夊緟杩涘叆lock閿佹椂鐨勭姸鎬佹槸WAITING鎴栬€匱IME_WAITING锛屽洜涓簂ock鏄敤LockSupport瀹炵幇鐨勶紙婧愮爜杩樻病鐮旂┒锛夈€?/p>

 娴嬭瘯濡備笅锛?/p>

public class MyService {

   public static synchronized void serviceMethod1(){
銆€銆€銆€銆€try{
銆€銆€銆€銆€銆€銆€
System.out.println(Thread.currentThread().getName+"杩涘叆浜嗕笟鍔℃柟娉?);
銆€銆€銆€銆€銆€銆€Thread.sleep(millis: 1000);
銆€銆€銆€銆€} catch (Execption e){
銆€銆€銆€銆€銆€銆€e.printStackTrace();
銆€銆€銆€銆€}
銆€銆€
銆€銆€}

銆€銆€public static void serviceMethod2(){
        ReentrantLock reentrantLock = new ReentrantLock();
        reentrantLock.lock();
        System.out.println(Thread.currentThread().getName()+"杩涘叆浜嗕笟鍔℃柟娉?);
銆€銆€銆€銆€ try {
銆€銆€銆€銆€銆€銆€Thread.sleep(1000);
銆€銆€銆€銆€} catch (InterruptedException e) {
銆€銆€銆€銆€銆€銆€e.printStackTrace();
銆€銆€銆€銆€}
銆€銆€銆€銆€銆€銆€reentrantLock.unlock();

銆€銆€銆€銆€}
}
public class MyThread1 extends Thread{
    @Override
    public void run() {
        MyService.serviceMethod1();
}

public class MyThread2 extends Thread{
    @Override
    public void run() {
        MyService.serviceMethod1();
    }
}

public class MyThread3 extends Thread{
    @Override
    public void run() {
        MyService.serviceMethod2();
}
}

public class MyThread4 extends Thread{
    @Override
    public void run() {
        MyService.serviceMethod2();
    }
}

public class ThreadStatusTest {

    public static void main(String[] args){
        test1();
        test2();
    }
    
    public static void test1(){
        MyThread1 t1 = new MyThread1();
        t1.setName("a");
        t1.start();

        MyThread2 t2 = new MyThread2();
        t2.setName("b");
        t2.start();

        System.out.println("t2鐨勭姸鎬?"+t2.getState());
    }
    
    public static void test2(){
        MyThread3 t3 = new MyThread3();
        t3.setName("a");
        t3.start();

        MyThread4 t4 = new MyThread4();
        t4.setName("b");
        t4.start();

        System.out.println("t4鐨勭姸鎬?"+t4.getState());
    }
}

test1() 杩愯缁撴灉锛?
銆€銆€a杩涘叆浜嗕笟鍔℃柟娉?br>銆€銆€t2鐨勭姸鎬?RUNNABLE
銆€銆€b杩涘叆浜嗕笟鍔℃柟娉?br>
test2() 杩愯缁撴灉锛?br>
銆€銆€a杩涘叆浜嗕笟鍔℃柟娉?br>銆€銆€t4鐨勭姸鎬?RUNNABLE
銆€銆€b杩涘叆浜嗕笟鍔℃柟娉?/em>

4銆佸父鐢ㄦ柟娉?nbsp;

銆€銆€1锛夈€乻tart() 鍚姩绾跨▼鐨勪竴绉嶆柟寮忥紝绾跨▼璋冪敤start()鏂规硶鍚庣敱NEW鐘舵€佸彉涓篟UNNABLE鐘舵€佷腑鐨凴EADY鐘舵€侊紝绛夊緟CPU鍒嗛厤鏃堕棿鐗囷紝瀹冩槸Thread绫荤殑鏂规硶锛?/p>

銆€銆€2锛夈€?run() 鎵€闇€瀹炵幇鐨勯€昏緫鍐欏湪run鏂规硶閲岋紝绾跨▼鑾峰緱鏃堕棿鐗囧悗鐢盧EADY鐘舵€佸彉涓篟UNNING锛屽苟鑷姩璋冪敤run()鏂规硶锛屽綋鐒秗un()鏂规硶涔熷彲浠ョ洿鎺ヨ皟鐢紝閭e畠灏辨槸鏅€氭柟娉曪紝鍜岀嚎绋嬫棤鍏筹紱

銆€銆€3锛夈€乻leep(...) 绾跨▼鐢盧UNNABLE鐘舵€佸彉涓篢IMED_WAITING鐘舵€侊紝璋冪敤姝ゆ柟娉曚細鎶涘嚭InterruptedException寮傚父锛岀嚎绋嬭嚜宸辨嫢鏈夌郴缁熻祫婧愶紝骞剁瓑寰呮椂闂村埌浜嗭紝鑷繁閱掓潵锛岃繖鏄拰wait()鏂规硶鐨勪富瑕佸尯鍒紱

銆€銆€4锛夈€亀ait()  notify()  notifyAll() 杩欎笁涓兘鏄疧bject绫荤殑鏂规硶锛屽畠浠槸閰嶅悎浣跨敤鐨勶紝璋冪敤wait()鏂规硶鐨勭嚎绋嬬姸鎬佺敱RUNNABLE涓殑RUNNING鍙樹负WAITING鐘舵€侊紝骞朵笖姝ゅ璞℃槸涓嶅崰鏈夌郴缁熻祫婧愮殑锛屽綋璋冪敤notify()鎴杗otifyAll() 鏂规硶鍚庣嚎绋嬪張杩涘叆RUNNABLE涓殑READY鐘舵€侊紝绛夊緟鑾峰彇CPU鏃堕棿鐗囷紱

銆€銆€5锛夈€乯oin(...) 绛夊緟绾跨▼瀵硅薄閿€姣侊紝绾跨▼鐘舵€佺敱RUNNABLE鍙樹负WAITING鎴栬€匱IMED_WAITING锛?/p>

銆€銆€6锛夈€乮nterrupt() 涓柇绾跨▼锛岀嚎绋嬬姸鎬佸彉涓篢ERMINATED锛?/p>

銆€銆€7锛夈€亂ield() 锛岀嚎绋嬬姸鎬佺敱RUNNING鍙樹负READY锛屽嵆鐢辫繍琛屼腑鍙樹负灏辩华鐘舵€侊紝鍚戝鐞嗗櫒琛ㄧず鑷繁鎰挎剰鏀惧純褰撳墠CPU璧勬簮锛堣鍑鸿嚜宸辩殑鎵ц鏃堕棿锛夛紝浣嗘斁寮冩椂闂翠笉纭畾锛屾湁鍙兘鍒氬垰鏀惧純锛岄┈涓婂張鑾峰緱CPU鏃堕棿鐗囷紝鎵€鏈夋鏂规硶骞朵笉鑳戒繚璇佸叾瀹冪嚎绋嬩竴瀹氭墽琛岋紝璋冪敤姝ゆ柟娉曠殑绾跨▼涓€瀹氫笉鎵ц锛岃€屾槸鐪婥PU鏄惁鍒嗛厤浜嗘椂闂寸墖锛屽苟涓斿畠鍙細璁╀紭鍏堢骇涓嶄綆浜庡綋鍓嶇嚎绋嬬殑绾跨▼鎵ц锛屼紭鍏堢骇姣斿畠浣庣殑鏄病鏈夋満浼氭墽琛岀殑銆?/p>

5銆佺嚎绋嬬殑浼樺厛绾?/strong>

銆€銆€绾跨▼浼樺厛绾т负1-10锛堢敱浣庡埌楂橈級锛岄粯璁や紭鍏堢骇鏄?锛屼紭鍏堢骇楂樼殑绾跨▼鍒嗛厤鐨勬椂闂寸墖鐨勬暟閲忚浣庝簬浼樺厛绾т綆鐨勶紝鎴戜滑鍙互璋冪敤Thread.setPriority(int) 鏂规硶鏉ヤ负绾跨▼璁剧疆浼樺厛绾э紝鍦ㄨ缃嚎绋嬩紭鍏堢骇鏃跺簲娉ㄦ剰锛屼簤瀵归绻侀樆濉炵殑锛屽浼戠湢銆両O銆佹暟鎹簱绛変换鍔$殑绾跨▼搴旇缃緝楂樼殑浼樺厛绾э紝瀵逛簬鍋忛噸璁$畻鐨勶紝濡傞渶瑕佽緝澶氱殑CPU鏃堕棿鎴栬€呭亸杩愮畻鐨勭嚎绋嬪垯搴旇缃緝浣庣殑浼樺厛绾э紝纭繚澶勭悊鍣ㄤ笉浼氳鐙崰銆?/p>

6銆佺嚎绋嬮棿鐨勯€氫俊

銆€銆€1锛夈€?em id="__mceDel">volatile  synchronized

銆€銆€杩欎袱涓叧閿瓧鍙互瀹炵幇绾跨▼闂寸殑閫氳锛屾垜浠煡閬撴瘡涓嚎绋嬮兘鏈夎嚜宸辩殑宸ヤ綔鍐呭瓨锛屽苟涓斿畠浠繕鏈夊叡浜唴瀛橈紝绾跨▼瀵逛竴涓彉閲忎慨鏀规椂浼氬厛浠庡叡浜唴瀛樹腑璇诲彇杩欎釜鍙橀噺鍒拌嚜宸辩鏈夌殑宸ヤ綔鍐呭瓨涓紝鑻ユ槸涓€涓櫘閫氬彉閲忓垯淇敼鍚庡埛鏂板埌涓诲唴瀛樹腑鐨勬椂鏈烘椂闅忔満鐨勶紝鑻ユ槸volatile鍙橀噺锛堝彲瑙佹€у拰鏈夊簭鎬э級锛岃繖鏃跺彟涓€涓嚎绋嬫潵璇昏繖涓彉閲忥紝鍒欏畠浼氳绔嬪嵆鍒锋柊鍒颁富鍐呭瓨涓幓锛岃鍚庨潰璇诲彇鐨勭嚎绋嬭兘鐪嬪埌鍙樺寲锛岃繖灏卞疄鐜颁簡涓や釜绾跨▼涔嬮棿鐨勯€氫俊銆?/p>

 鎶€鏈垎浜浘鐗? src=

銆€銆€synchronized瀹炵幇绾跨▼涔嬮棿鐨勫悓姝ワ紝B绾跨▼蹇呴』绛夊埌A绾跨▼閲婃斁閿佹墠鑳借幏寰楃浉搴旂殑璧勬簮锛岃繖鏄嚎绋嬩箣闂寸殑涓€绉嶉€氫俊鏂瑰紡銆?/p>

銆€銆€2锛夈€佺瓑寰呴€氱煡鏈哄埗 wait()  notify()  notifyAll()

銆€銆€涓€涓繃绋嬩粠涓€涓嚎绋嬪紑濮嬶紝鍦ㄥ彟涓€涓嚎绋嬬粨鏉燂紝鍓嶈€呮槸鐢熶骇鑰咃紝鍚庤€呮槸娑堣垂鑰咃紝鐢熸垚鑰呭畬鎴愮敓浜э紝閫氱煡娑堣垂鑰呭幓娑堣垂锛屽畬鎴愪簩鑰呬箣闂寸殑閫氫俊銆?/p>

銆€銆€绛夊緟閫氱煡鐨勭浉鍏虫柟娉曟湁

銆€銆€銆€銆€wait()锛氳皟鐢ㄨ鏂规硶鐨勭嚎绋嬭繘鍏AITING鐘舵€侊紝鍙湁琚叾浠栫嚎绋嬮€氱煡鎴栬€呰涓柇鎵嶄細杩斿洖锛岃皟鐢ㄨ鏂规硶鍚庯紝浼氶噴鏀惧璞$殑閿侊紱

銆€銆€銆€銆€wait(long)锛氳秴鏃剁瓑寰呬竴娈垫椂闂达紝杩欓噷鐨勫弬鏁版椂闂存槸姣锛屼篃灏辨槸绛夊緟闀胯揪n姣锛屽鏋滄病鏈夐€氱煡灏辫秴鏃惰繑鍥烇紱

銆€銆€銆€銆€wait(long,int)锛氳秴鏃舵椂闂翠负long姣+int绾崇锛?/p>

銆€銆€銆€銆€notify()锛氶€氱煡涓€涓湪瀵硅薄绛夊緟鐨勭嚎绋嬶紝浣垮叾浠巜ait()鏂规硶杩斿洖锛岃€岃繑鍥炵殑鍓嶆彁鏃惰绾跨▼鑾峰彇浜嗗璞$殑閿侊紱

銆€銆€銆€銆€notifyAll()锛氶€氱煡鎵€鏈夌瓑寰呭湪璇ュ璞′笂鐨勭嚎绋嬨€?/p>

銆€銆€浠ヤ笂鏂规硶閮芥潵鑷猨ava.lang.Object绫讳腑锛屾墍浠ュ彧瑕佹槸瀵硅薄灏卞彲浠ヨ皟鐢ㄥ畠浠€?/p>

銆€銆€銆€銆€wait()銆乶otify()鍜宯otifyAll()璋冪敤鏃堕渶瑕佹敞鎰忥細

銆€銆€銆€銆€a銆佷娇鐢╳ait()銆乶otify()鍜宯otifyAll()鏃堕渶瑕佸厛瀵硅皟鐢ㄥ璞″姞閿侊紱

銆€銆€銆€銆€b銆佽皟鐢╳ait()鏂规硶鍚庯紝绾跨▼鐘舵€佺敱RUNNING鍙樹负WAITING,骞跺皢褰撳墠绾跨▼鏀剧疆鍒板璞$殑绛夊緟闃熷垪锛?/p>

銆€銆€銆€銆€c銆乶otify()鎴栬€卬otifyAll()鏂规硶璋冪敤鍚庯紝绛夊緟绾跨▼渚濇棫涓嶄細浠巜ait()杩斿洖锛岄渶瑕佽皟鐢╪otify()鎴栬€卬otifyAll()鐨勭嚎绋嬮噴鏀鹃攣涔嬪悗锛岀瓑寰呯嚎绋嬫墠鏈夋満浼氫粠wait()杩斿洖锛?/p>

銆€銆€銆€銆€d銆乶otify()鏂规硶灏嗙瓑寰呴槦鍒椾腑鐨勪竴涓瓑寰呯嚎绋嬩粠绛夊緟闃熷垪涓Щ鍒板悓姝ラ槦鍒椾腑锛岃€宯otifyAll()鏂规硶灏嗙瓑寰呴槦鍒椾腑鎵€鏈夌殑绾跨▼鍏ㄩ儴绉诲埌鍚屾闃熷垪锛岃绉诲姩鐨勭嚎绋嬬姸

銆€銆€銆€銆€銆€銆€鎬佺敱WAITING鍙樹负BLOCKED锛?/p>

銆€銆€銆€銆€e銆佷粠wait()鏂规硶杩斿洖鐨勫墠鎻愭槸鑾峰緱浜嗚皟鐢ㄥ璞$殑閿併€?/p>

銆€銆€A绾跨▼璋冪敤wait() 鏂规硶浼氶噴鏀炬寔鏈夌殑瀵硅薄鐩戣鍣紝杩涘叆绛夊緟鐘舵€侊紝绛塀绾跨▼鎵ц瀹屼簡鍚庯紝璋冪敤notify()鎴栬€卬otifyAll() 鏂规硶鍞ら啋A绾跨▼

銆€銆€3锛夈€佺閬撹緭鍏ャ€佽緭鍑烘祦

銆€銆€銆€銆€绠¢亾娴佷笓闂ㄧ敤浜庣嚎绋嬩箣闂寸殑閫氫俊锛屽拰鏅€氬瓧绗﹀瓧鑺傛祦鐨勫尯鍒槸瀹冧滑鎿嶄綔鐨勬槸鍐呭瓨鑰屼笉鏄‖鐩樸€?/p>

銆€銆€銆€銆€涓昏鏈夊洓绉嶅疄鐜帮細瀛楄妭娴侊細PipedOutputStream銆丳ipedInputStream

銆€銆€銆€銆€銆€銆€銆€銆€銆€銆€銆€銆€瀛楃娴侊細PipedWriter銆丳ipedReader 

 銆€   4锛夈€乯oin(...)

銆€銆€銆€銆€褰撳墠瀛樺湪绾跨▼A銆丅锛岃嫢A鎵ц浜唈oin()鏂规硶锛屾剰鎬濆氨鏄細褰撳墠绾跨▼A绛夊緟B绾跨▼鎵ц瀹屾垚涔嬪悗锛屾墠缁х画鎵ц锛屽嵆瀹屾垚浜咥銆丅闂寸殑閫氫俊銆?/p>

銆€銆€5锛夈€乀hreadLocal

銆€銆€銆€銆€ThreadLocal锛屽嵆绾跨▼鍙橀噺锛屾槸涓€涓互ThreadLocal瀵硅薄涓洪敭锛屼换鎰忓璞′负鍊肩殑瀛樺偍缁撴瀯銆傚彲浠ラ€氳繃set(T)鏂规硶鏉ヨ缃竴涓€硷紝鍦ㄥ綋鍓嶇嚎绋嬩笅閫氳繃get()鏂规硶鑾峰彇鍘熷厛鑾峰彇鐨勫€笺€?em id="__mceDel">

銆€銆€涓嬮潰鎽樻妱銆奐ava骞跺彂缂栫▼鐨勮壓鏈€嬩腑鐨勪竴娈典唬鐮侊細

public class Profiler {
    
    private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){
        protected Long initialValue(){
            return System.currentTimeMillis();
        }
    };
    
    public static final void begin(){
        TIME_THREADLOCAL.set(System.currentTimeMillis());
    }
    
    public static final long end(){
        return System.currentTimeMillis() - TIME_THREADLOCAL.get();
    }
    
    public static void main(String[] args) throws InterruptedException {
        Profiler.begin();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Cost: "+Profiler.end() +" mills");
    }
}

杩愯缁撴灉锛?br>Cost: 1005 mills

 鍙傝€冭祫鏂欙細銆奐ava骞跺彂缂栫▼鐨勮壓鏈€?/em>

銆€銆€鏈€鍚庯紝濡傛湁鍐欑殑涓嶅鎴栦笉濂界殑鍦版柟锛岃鎸囧嚭锛岃阿璋紒






















以上是关于Java澶氱嚎绋嬪涔犳€荤粨涔?--澶氱嚎绋嬪熀纭€的主要内容,如果未能解决你的问题,请参考以下文章

Python澶氱嚎绋嬩箣姝婚攣

寮冪敤 wget, 鎷ユ姳澶氱嚎绋嬩笅杞?axel

澶氱嚎绋嬭绠梥tream parallelStream

瓒e浘锛氳€佹墜璋冭瘯澶氱嚎绋嬶紝666

澶氱嚎绋嬭鑰呭啓鑰呴棶棰?-鐢≦T瀹炵幇

绾跨▼瀹夊叏: 浜掓枼閿佸拰鑷棆閿?10绉?