锘??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕精品三区无码亚洲,亚洲成在人线aⅴ免费毛片,精品日韩99亚洲的在线发布http://m.tkk7.com/jiangshachina/category/53896.html鍚屾槸Java鐖卞ソ鑰咃紝鐩擱綍蹇呮浘鐩歌瘑錛?lt;br>    a cup of Java, cheers!zh-cnTue, 22 Apr 2014 12:46:37 GMTTue, 22 Apr 2014 12:46:37 GMT60Java騫跺彂鍩虹瀹炶返--姝婚攣(鍘?http://m.tkk7.com/jiangshachina/archive/2013/12/29/408180.htmlSha JiangSha JiangSun, 29 Dec 2013 12:19:00 GMThttp://m.tkk7.com/jiangshachina/archive/2013/12/29/408180.htmlhttp://m.tkk7.com/jiangshachina/comments/408180.htmlhttp://m.tkk7.com/jiangshachina/archive/2013/12/29/408180.html#Feedback1http://m.tkk7.com/jiangshachina/comments/commentRss/408180.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/408180.html
Java騫跺彂鍩虹瀹炶返--姝婚攣
鏈枃鏄?a href="http://m.tkk7.com/jiangshachina/category/53896.html">Java騫跺彂鍩虹瀹炶返緋誨垪涓殑涓綃囷紝浠嬬粛浜嗘渶綆鍗曠殑姝婚攣鍦烘櫙錛屽茍浣跨敤jstack浜х敓鐨則hread dump鏉ユ煡鎵炬閿併?2013.12.29鏈鍚庢洿鏂?

1. 姝婚攣
涓轟簡鑳藉緇存姢綰跨▼鐨勫畨鍏ㄦэ紝Java鎻愪緵鐨勯攣鏈哄埗錛屼絾涓嶆伆褰撳湴浣跨敤閿佸垯鍙兘浜х敓姝婚攣銆傛閿佹槸騫跺彂緙栫▼涓竴涓棤娉曠粫寮鐨勯棶棰樸傚彧瑕佸湪涓涓換鍔′腑浣跨敤浜嗕竴涓互涓婄殑閿侊紝閭d箞灝卞瓨鍦ㄦ閿佺殑椋庨櫓銆?br />姝婚攣浜х敓鐨勭洿鎺ュ師鍥犻潪甯哥畝鍗曪紝鍗充袱涓嚎紼嬪湪鐩鎬簰絳夊緟瀵規柟鎵鎵ф湁鐨勯攣銆?br />
2. 閿侀『搴忔閿?/span>
鍦ㄦ閿佸満鏅腑錛屾渶鍏稿瀷鐨勫氨鏄攣欏哄簭姝婚攣錛屼唬鐮佹竻鍗?灝辨槸涓涓緢甯歌鐨勭ず渚嬨?br />
娓呭崟1
public class DeadLock {

    
private Object leftLock = new Object();
    
private Object rightLock = new Object();

    
public void leftRight() {
        
synchronized (leftLock) {
            
try {
                TimeUnit.SECONDS.sleep(
3);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }

            
synchronized (rightLock) {
                System.out.println(
"leftRight");
            }
        }
    }

    
public void rightLeft() {
        
synchronized (rightLock) {
            
try {
                TimeUnit.SECONDS.sleep(
3);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }

            
synchronized (leftLock) {
                System.out.println(
"leftRight");
            }
        }
    }

    
public static void main(String[] args) {
        
final DeadLock deadLock = new DeadLock();

        Thread t1 
= new Thread(new Runnable() {

            @Override
            
public void run() {
                deadLock.leftRight();
            }
        });

        Thread t2 
= new Thread(new Runnable() {

            @Override
            
public void run() {
                deadLock.rightLeft();
            }
        });

        t1.start();
        t2.start();
    }
}

3. Thread Dump
JDK鎻愪緵浜嗕竴緇勫懡浠よ宸ュ叿錛屽叾涓氨鍖呮嫭jstack銆傞氳繃jstack鍙互鑾峰彇褰撳墠姝h繍琛岀殑Java榪涚▼鐨刯ava stack鍜宯ative stack淇℃伅銆傚鏋淛ava榪涚▼宕╂簝浜嗭紝涔熷彲浠ラ氳繃瀹冩潵鑾峰彇core file涓殑java stack鍜宯ative stack淇℃伅錛屼互鏂逛究鎴戜滑瀹氫綅闂銆?br />涓轟簡鑳藉浣跨敤jstack鍘昏緭鍑虹洰鏍嘕ava榪涚▼鐨則hread dump錛岄鍏堝繀欏昏寮勬竻妤氬湪鎵ц娓呭崟1鐨勭▼搴忔椂錛岃紼嬪簭鐨勮繘紼嬪彿銆侸DK鎻愪緵鐨勫彟涓涓懡浠よ宸ュ叿jps鍙互鑾峰彇緋葷粺涓墍鏈塉ava榪涚▼鐨勭浉鍏充俊鎭?br />鍦ㄥ懡浠よ紿楀彛涓墽琛屽懡浠?em>jps錛屽嵆鍙互寰楀埌娓呭崟2鎵紺虹殑緇撴灉
娓呭崟2
C:\Documents and Settings\Administrator>jps
2848
4552 DeadLock
5256 Jps
鍏朵腑4552灝辨槸鍦ㄧ瑪鑰呮満鍣ㄤ笂鎵ц紼嬪簭DeadLock鏃舵墍鐢熸垚Java榪涚▼鐨勮繘紼嬪彿銆?br />鐒跺悗鍐嶆墽琛屽懡浠?em>jstack 4552錛屽湪絎旇呯殑鏈哄櫒涓婂氨浼氬緱鍒版竻鍗?鎵紺虹殑緇撴灉
娓呭崟3
C:\Documents and Settings\Administrator>jstack 
4552
2013-12-29 18:45:41
Full thread dump Java HotSpot(TM) Client VM (
23.25-b01 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x00878800 nid=0xd00 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" prio=6 tid=0x02b56c00 nid=0x14ec waiting for monitor entry [0x02fdf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at concurrency.deadlock.DeadLock.rightLeft(DeadLock.java:
33)
        - waiting to lock <0x22be6598> (a java.lang.Object)
        - locked <0x22be65a0> (a java.lang.Object)
        at concurrency.deadlock.DeadLock$
2.run(DeadLock.java:53)
        at java.lang.Thread.run(Thread.java:
724)

"Thread-0" prio=6 tid=0x02b55c00 nid=0x354 waiting for monitor entry [0x02f8f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at concurrency.deadlock.DeadLock.leftRight(DeadLock.java:
19)
        - waiting to lock <0x22be65a0> (a java.lang.Object)
        - locked <0x22be6598> (a java.lang.Object)
        at concurrency.deadlock.DeadLock$
1.run(DeadLock.java:45)
        at java.lang.Thread.run(Thread.java:
724)

"Service Thread" daemon prio=6 tid=0x02b34800 nid=0x133c runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" daemon prio=10 tid=0x02b13800 nid=0x10fc waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x02b11c00 nid=0x1424 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x02b10800 nid=0x1100 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x02af4c00 nid=0x1238 in Object.wait() [0x02daf000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x22b60fb8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:
135)
        - locked <0x22b60fb8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:
151)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:
189)

"Reference Handler" daemon prio=10 tid=0x02af0000 nid=0x12e8 in Object.wait() [0x02d5f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x22b60da0> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:
503)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:
133)
        - locked <0x22b60da0> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x02aee400 nid=0x129c runnable

"VM Periodic Task Thread" prio=10 tid=0x02b48000 nid=0x89c waiting on condition

JNI global references: 
117


Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x02af4a3c (object 0x22be6598
, a java.lang.Object),
  which is held by 
"Thread-0"
"Thread-0":
  waiting to lock monitor 0x02af310c (object 0x22be65a0
, a java.lang.Object),
  which is held by 
"Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at concurrency.deadlock.DeadLock.rightLeft(DeadLock.java:
33)
        - waiting to lock <0x22be6598> (a java.lang.Object)
        - locked <0x22be65a0> (a java.lang.Object)
        at concurrency.deadlock.DeadLock$
2.run(DeadLock.java:53)
        at java.lang.Thread.run(Thread.java:
724)
"Thread-0":
        at concurrency.deadlock.DeadLock.leftRight(DeadLock.java:
19)
        - waiting to lock <0x22be65a0> (a java.lang.Object)
        - locked <0x22be6598> (a java.lang.Object)
        at concurrency.deadlock.DeadLock$
1.run(DeadLock.java:45)
        at java.lang.Thread.run(Thread.java:
724)

Found 
1 deadlock.
鍦ㄤ笂榪拌緭鍑轟腑錛屾垜浠彲浠ュ緢鏄庣‘鍦扮湅鍒頒竴涓閿?br />
"Thread-1":
  waiting to lock monitor 0x02af4a3c (object 0x22be6598
, a java.lang.Object),
  which is held by 
"Thread-0"
"Thread-0":
  waiting to lock monitor 0x02af310c (object 0x22be65a0
, a java.lang.Object),
  which is held by 
"Thread-1"
騫朵笖瀹冭繕鏍囨槑浜嗙▼搴忔槸鍦ㄥ摢涓湴鏂規椂鍙戠幇浜嗕笂榪版閿?br />
"Thread-1":
        at concurrency.deadlock.DeadLock.rightLeft(DeadLock.java:
33)
        - waiting to lock <0x22be6598> (a java.lang.Object)
        - locked <0x22be65a0> (a java.lang.Object)
        at concurrency.deadlock.DeadLock$
2.run(DeadLock.java:53)
        at java.lang.Thread.run(Thread.java:
724)
"Thread-0":
        at concurrency.deadlock.DeadLock.leftRight(DeadLock.java:
19)
        - waiting to lock <0x22be65a0> (a java.lang.Object)
        - locked <0x22be6598> (a java.lang.Object)
        at concurrency.deadlock.DeadLock$
1.run(DeadLock.java:45)
        at java.lang.Thread.run(Thread.java:
724)

4. 灝忕粨
姝婚攣浜х敓鐨勭洿鎺ュ師鍥犻潪甯哥畝鍗曪紝鍗充袱涓嚎紼嬪湪鐩鎬簰絳夊緟瀵規柟鎵鎵ф湁鐨勯攣銆傞攣欏哄簭姝婚攣鏄叾涓渶緇忓吀鐨勫満鏅紝姝ゅ榪樻湁鍔ㄦ佺殑閿侀『搴忔閿併傝櫧鐒惰〃鐜板艦寮忔湁鎵涓嶅悓錛屼絾鏈川涓婇兘鏄袱涓嚎紼嬪湪浠ヤ笉鍚岀殑欏哄簭鏉ヨ幏鍙栫浉鍚岄攣鏃訛紝鍙戠敓浜嗘閿侀棶棰樸?br />浣跨敤thread dump鍙互甯姪鎴戜滑鍒嗘瀽姝婚攣浜х敓鐨勫師鍥犮傞櫎浜嗙洿鎺ヤ嬌鐢╦stack鍛戒護鏉ヨ幏鍙杢hread dump杈撳嚭浠ュ錛孞DK榪樻彁渚涗簡jvisualvm宸ュ叿錛屽畠鑳戒互鍙鍖栫殑鏂瑰紡灞曠ずJava紼嬪簭鐨勮繘紼嬪彿騫跺鍑簍hread dump銆?/div>

Sha Jiang 2013-12-29 20:19 鍙戣〃璇勮
]]>
Java騫跺彂鍩虹瀹炶返--鍒嗚屾不涔?鍘?http://m.tkk7.com/jiangshachina/archive/2013/10/23/405577.htmlSha JiangSha JiangWed, 23 Oct 2013 15:27:00 GMThttp://m.tkk7.com/jiangshachina/archive/2013/10/23/405577.htmlhttp://m.tkk7.com/jiangshachina/comments/405577.htmlhttp://m.tkk7.com/jiangshachina/archive/2013/10/23/405577.html#Feedback0http://m.tkk7.com/jiangshachina/comments/commentRss/405577.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/405577.html闃呰鍏ㄦ枃

Sha Jiang 2013-10-23 23:27 鍙戣〃璇勮
]]>
Java騫跺彂鍩虹瀹炶返--閫鍑轟換鍔I(鍘?http://m.tkk7.com/jiangshachina/archive/2013/10/07/404690.htmlSha JiangSha JiangMon, 07 Oct 2013 08:55:00 GMThttp://m.tkk7.com/jiangshachina/archive/2013/10/07/404690.htmlhttp://m.tkk7.com/jiangshachina/comments/404690.htmlhttp://m.tkk7.com/jiangshachina/archive/2013/10/07/404690.html#Feedback3http://m.tkk7.com/jiangshachina/comments/commentRss/404690.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/404690.html
Java騫跺彂鍩虹瀹炶返--閫鍑轟換鍔I
鍦?a href="http://m.tkk7.com/jiangshachina/category/53896.html">鏈郴鍒?/a>鐨?a href="http://m.tkk7.com/jiangshachina/archive/2013/09/21/404269.html">涓婁竴綃?/a>涓墍榪扮殑閫鍑哄茍鍙戜換鍔$殑鏂瑰紡閮芥槸鍩轟簬JDK 5涔嬪墠鐨凙PI錛屾湰鏂囧皢浠嬬粛浣跨敤鐢盝DK 5寮曞叆鐨勫茍鍙戝伐鍏峰寘涓殑API鏉ラ鍑轟換鍔°?2013.10.08鏈鍚庢洿鏂?

    鍦ㄦ湰緋誨垪鐨勫墠涓綃囦腑璁茶堪浜嗕笁縐嶉鍑哄茍鍙戜換鍔$殑鏂瑰紡--鍋滄綰跨▼錛涘彲鍙栨秷鐨勪換鍔★紱涓柇錛屼絾閮芥槸鍩轟簬JDK 5涔嬪墠鐨凙PI銆傛湰綃囧皢浠嬬粛鐢盝DK 5寮曞叆鐨刯ava.concurrent鍖呬腑鐨凢uture鏉ュ彇娑堜換鍔$殑鎵ц銆?br />
1. Future妯″紡
    Future鏄茍鍙戠紪紼嬩腑鐨勪竴縐嶅父瑙佽璁℃ā寮忥紝瀹冪浉褰撲簬鏄疨roxy妯″紡涓嶵hread-Per-Message妯″紡鐨勭粨鍚堛傚嵆錛屾瘡嬈¢兘鍒涘緩涓涓崟鐙殑綰跨▼鍘繪墽琛屼竴涓楁椂鐨勪換鍔★紝騫朵笖鍒涘緩涓涓狥uture瀵硅薄鍘繪寔鏈夊疄闄呯殑浠誨姟瀵硅薄錛屽湪灝嗘潵闇瑕佺殑鏃跺欏啀鍘昏幏鍙栧疄闄呬換鍔$殑鎵ц緇撴灉銆?br />渚濈劧鍏堝垱寤轟竴涓敤浜庢壂鎻忔枃浠剁殑浠誨姟FileScannerTask錛屽浠g爜娓呭崟1鎵紺猴紝
娓呭崟1
public class FileScannerTask implements Runnable {

    
private File root = null;

    
private ArrayList<String> filePaths = new ArrayList<String>();

    
public FileScannerTask(File root) {
        
if (root == null || !root.exists() || !root.isDirectory()) {
            
throw new IllegalArgumentException("root must be directory");
        }

        
this.root = root;
    }

    @Override
    
public void run() {
        travleFiles(root);
    }

    
private void travleFiles(File parent) {
        String filePath 
= parent.getAbsolutePath();
        filePaths.add(filePath);

        
if (parent.isDirectory()) {
            File[] children 
= parent.listFiles();
            
if (children != null) {
                
for (File child : children) {
                    travleFiles(child);
                }
            }
        }
    }

    
public List<String> getFilePaths() {
        
return (List<String>) filePaths.clone();
    }
}
姝ゅ鐨勬枃浠舵壂鎻忎換鍔★紝鎻愪緵浜嗕竴涓猤etFilePaths()鏂規硶浠ュ厑璁擱殢鏃墮兘鍙互鍙栧嚭褰撳墠宸叉壂鎻忚繃鐨勬枃浠剁殑璺緞(鐩稿綋浜庝竴涓換鍔″揩鐓?銆傜劧鍚庯紝鍒涘緩涓涓拡瀵硅浠誨姟鐨凢uture綾伙紝濡備唬鐮佹竻鍗?鎵紺猴紝
娓呭崟2
public class FileScannerFuture {

    
private FileScannerTask task = null;

    
public FileScannerFuture(FileScannerTask task) {
        
new Thread(task).start();
        
this.task = task;
    }

    
public List<String> getResult() {
        
return task.getFilePaths();
    }
}
FileScannerFuture鎸佹湁FileScannerTask鐨勫紩鐢紝騫跺垱寤轟竴涓嫭绔嬬殑綰跨▼鏉ユ墽琛岃浠誨姟銆傚湪浠誨姟鐨勬墽琛岃繃紼嬩腑錛屽簲鐢ㄧ▼搴忓彲浠ュ湪"鏈潵"鐨勬煇涓椂鍒誨幓鑾峰彇涓涓換鍔$殑蹇収錛屽浠g爜娓呭崟3鎵紺猴紝
娓呭崟3
public static void main(String[] args) throws Exception {
    FileScannerFuture future 
= new FileScannerFuture(new FileScannerTask(new File("C:")));

    TimeUnit.SECONDS.sleep(
1);
    List
<String> filePaths1 = future.getResult();
    System.out.println(filePaths1.size());

    TimeUnit.SECONDS.sleep(
1);
    List
<String> filePaths2 = future.getResult();
    System.out.println(filePaths2.size());
}

2. 浣跨敤騫跺彂宸ュ叿鍖呬腑鐨凢uture瀹炵幇
    鍓嶉潰鎵灞曠ず鐨凢uture瀹炵幇鍗佸垎鐨勭畝闄嬶紝娌℃湁瀹為檯搴旂敤鐨勬剰涔夈備嬌鐢‵ileScannerFuture錛屽簲鐢ㄧ▼搴忓湪鑾峰彇filePaths鏃訛紝鏃犳硶寰楃煡鍏惰幏鍙栫殑鏄惁涓烘渶緇堢粨鏋滐紝鍗蟲棤娉曞垽鏂璅ileScannerTask鏄惁宸茬粡瀹屾垚銆傝屼笖錛屼篃涓嶈兘鍦ㄥ繀瑕佹椂鍋滄FileScannerTask鐨勬墽琛屻傛鏃犵枒闂紝鐢盝DK 5寮曞叆鐨勫茍鍙戝伐鍏峰寘鑲畾浼氭彁渚涙綾誨疄鐢ㄥ伐鍏鳳紝濡侳utureTask銆備負浜嗕嬌鐢ㄥ茍鍙戝伐鍏峰寘涓殑Future錛岄渶瑕佷慨鏀瑰墠榪扮殑FileScannerTask瀹炵幇錛岃鍏跺疄鐜癈allable鎺ュ彛錛屽浠g爜娓呭崟4鎵紺猴紝
娓呭崟4
public class FileScannerTask implements Callable<List<String>> {

    
private File root = null;

    
private List<String> filePaths = new ArrayList<String>();

    
public FileScannerTask(File root) {
        
if (root == null || !root.exists() || !root.isDirectory()) {
            
throw new IllegalArgumentException("root must be directory");
        }

        
this.root = root;
    }

    @Override
    
public List<String> call() {
        travleFiles(root);
        
return filePaths;
    }

    
private void travleFiles(File parent) {
        String filePath 
= parent.getAbsolutePath();
        filePaths.add(filePath);

        
if (parent.isDirectory()) {
            File[] children 
= parent.listFiles();
            
if (children != null) {
                
for (File child : children) {
                    travleFiles(child);
                }
            }
        }
    }

    
public List<String> getFilePaths() {
        
return (List<String>) filePaths.clone();
    }
}
搴旂敤紼嬪簭涔熻鐩稿簲鐨勪慨鏀規垚濡備唬鐮佹竻鍗?鎵紺猴紝浣跨敤ExecutorService鏉ユ彁浜や換鍔★紝騫跺垱寤轟竴涓狥uture/FutureTask瀹炰緥銆?br />
娓呭崟5
public static void main(String[] args) {
    ExecutorService executorService 
= Executors.newCachedThreadPool();
    Future
<List<String>> future = executorService.submit(new FileScannerTask(new File("C:")));

    
try {
        List
<String> filePaths = future.get();
        System.out.println(filePaths.size());
    } 
catch (InterruptedException e) {
        e.printStackTrace();
    } 
catch (ExecutionException e) {
        e.printStackTrace();
    }

    executorService.shutdown();
}
姝ゅ灝辨槸璋冪敤Future.get()鏂規硶鏉ヨ幏鍙栦換鍔$殑鎵ц緇撴灉錛屽鏋滀換鍔℃病鏈夋墽琛屽畬姣曪紝閭d箞璇ユ柟娉曞皢浼氳闃誨銆傝Future瀹炵幇鐨勫ソ澶勫氨鏄紝姝e父鎯呭喌涓嬶紝鍙湁鍦ㄤ換鍔℃墽琛屽畬姣曚箣鍚庢墠鑳借幏鍙栧叾緇撴灉錛屼互淇濊瘉璇ョ粨鏋滄槸鏈緇堟墽琛岀粨鏋溿?br />
3. 浣跨敤Future鍙栨秷浠誨姟
    Future闄や簡瀹氫箟鏈夊彲鑾峰彇鎵ц緇撴灉鐨刧et鏂規硶(get()浠ュ強get(long timeout, TimeUnit unit))錛岃繕瀹氫箟浜嗕笁涓柟娉曪細cancel()錛宨sCancelled()浠ュ強isDone()錛岀敤浜庡彇娑堜換鍔★紝浠ュ強鍒ゅ畾浠誨姟鏄惁宸茶鍙栨秷銆佸凡鎵ц瀹屾瘯銆傚浠g爜娓呭崟6鎵紺猴紝
娓呭崟6
public interface Future<V> {

    
boolean cancel(boolean mayInterruptIfRunning);
    
boolean isCancelled();
    
boolean isDone();
    
}
鍏朵腑錛宑ancel()鏂規硶涓殑boolean鍙傛暟鑻ヤ負true錛岃〃紺哄湪鍙栨秷璇ヤ換鍔℃椂錛岃嫢鎵ц璇ヤ換鍔$殑綰跨▼浠嶅湪榪愯涓紝鍒欏鍏惰繘琛屼腑鏂傚浠g爜娓呭崟7鎵紺猴紝鑻ヤ換鍔℃墽琛岃秴鏃朵簡錛岄偅涔堝氨鍙栨秷瀹冦?br />
娓呭崟7
public static void main(String[] args) {
    ExecutorService executorService 
= Executors.newCachedThreadPool();
    Future
<List<String>> future = executorService.submit(new FileScannerTask(new File("C:")));

    
try {
        List
<String> filePaths = future.get(1, TimeUnit.SECONDS);
        System.out.println(filePaths.size());
    } 
catch (InterruptedException e) {
        e.printStackTrace();
    } 
catch (ExecutionException e) {
        e.printStackTrace();
    } 
catch (TimeoutException e) {
        e.printStackTrace();
    } 
finally {
        future.cancel(
true);
    }

    executorService.shutdown();
}
鍦ㄥ疄闄呭簲鐢ㄤ腑錛屽彇娑堜換鍔$殑鍘熺敱鑲畾涓嶄粎浠呭彧鏄秴鏃惰繖涔堢畝鍗曪紝榪樺彲鑳芥槸鐢變簬鎺ュ彈鍒頒簡鐢ㄦ埛鐨勬寚浠ゃ傛鏃訛紝鍒欏彲鑳戒細浠庡彟涓涓嫭绔嬬嚎紼嬪幓鍙栨秷璇ヤ換鍔°傞櫎浜嗗彇娑堜換鍔′箣澶栵紝鏈夋椂榪橀渶瑕佸彇鍑轟換鍔′腑宸茬粡鐢熸垚鐨勯儴鍒嗙粨鏋溿備絾涓轟簡鑳藉鍝嶅簲浠誨姟鐨勯鍑猴紝棣栧厛闇瑕佷慨鏀笷ileScannerTask錛屼嬌寰楀綋浠誨姟琚彇娑?涓柇)鏃訛紝浠誨姟鑳藉鐪熸鐨勫揩閫熷仠姝㈠茍榪斿洖錛屽浠g爜娓呭崟8鎵紺猴紝
娓呭崟8
public class FileScannerTask implements Callable<List<String>> {

    

    
private void travleFiles(File parent) {
        
if (Thread.currentThread().isInterrupted()) {
            
return;
        }

        String filePath 
= parent.getAbsolutePath();
        filePaths.add(filePath);

        
if (parent.isDirectory()) {
            File[] children 
= parent.listFiles();
            
if (children != null) {
                
for (File child : children) {
                    travleFiles(child);
                }
            }
        }
    }

    
}
鐩稿簲鍦頒慨鏀瑰簲鐢ㄧ▼搴忕殑浠g爜錛屽浠g爜娓呭崟9鎵紺猴紝
娓呭崟9
public static void main(String[] args) {
    ExecutorService executorService 
= Executors.newCachedThreadPool();
    FileScannerTask task 
= new FileScannerTask(new File("C:"));
    
final Future<List<String>> future = executorService.submit(task);
    
    
new Thread(new Runnable() {
        
        @Override
        
public void run() {
            
try {
                TimeUnit.SECONDS.sleep(
1);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
            future.cancel(
true);
        }
    }).start();
    
    
try {
        List
<String> filePaths = future.get();
        System.out.println(filePaths.size());
    } 
catch (InterruptedException e) {
        e.printStackTrace();
    } 
catch (ExecutionException e) {
        e.printStackTrace();
    } 
catch (CancellationException e) {
        List
<String> filePaths = task.getFilePaths();
        System.out.println(
"Partly result: " + filePaths.size());
    }
    
    executorService.shutdown();
}
鐢變笂鍙煡錛屾澶勪嬌鐢‵uture.cancel(true)鐨勬湰璐ㄤ緷鐒舵槸鍒╃敤浜嗙嚎紼嬬殑涓柇鏈哄埗銆?br />
4. 灝忕粨
    浣跨敤Future鍙互鍦ㄤ換鍔″惎鍔ㄤ箣鍚庣殑鐗瑰畾鏃舵満鍐嶅幓鑾峰彇浠誨姟鐨勬墽琛岀粨鏋溿傜敱JDK 5寮曞叆鐨勫茍鍙戝伐鍏峰寘涓彁渚涚殑Future瀹炵幇涓嶄粎鍙互鑾峰彇浠誨姟鐨勬墽琛岀粨鏋滐紝榪樺彲浠ョ敤浜庡彇娑堜換鍔$殑鎵ц銆?/div>

Sha Jiang 2013-10-07 16:55 鍙戣〃璇勮
]]>
Java騫跺彂鍩虹瀹炶返--閫鍑轟換鍔(鍘?http://m.tkk7.com/jiangshachina/archive/2013/09/21/404269.htmlSha JiangSha JiangSat, 21 Sep 2013 11:11:00 GMThttp://m.tkk7.com/jiangshachina/archive/2013/09/21/404269.htmlhttp://m.tkk7.com/jiangshachina/comments/404269.htmlhttp://m.tkk7.com/jiangshachina/archive/2013/09/21/404269.html#Feedback0http://m.tkk7.com/jiangshachina/comments/commentRss/404269.htmlhttp://m.tkk7.com/jiangshachina/services/trackbacks/404269.html
Java騫跺彂鍩虹瀹炶返--閫鍑轟換鍔
璁″垝鍐欎竴涓?Java騫跺彂鍩虹瀹炶返"緋誨垪錛岀畻浣滄湰浜哄Java騫跺彂瀛︿範涓庡疄璺電殑綆鍗曟葷粨銆傛湰鏂囨槸璇ョ郴鍒楃殑絎竴綃囷紝浠嬬粛浜嗛鍑哄茍鍙戜換鍔$殑鏈綆鍗曟柟娉曘?2013.09.25鏈鍚庢洿鏂?

鍦ㄤ竴涓茍鍙戜換鍔¤鍚姩涔嬪悗錛屼笉瑕佹湡鏈涘畠鎬繪槸浼氭墽琛屽畬鎴愩傜敱浜庢椂闂撮檺鍒訛紝璧勬簮闄愬埗錛岀敤鎴鋒搷浣滐紝鐢氳嚦鏄換鍔′腑鐨勫紓甯?灝ゅ叾鏄繍琛屾椂寮傚父)錛?..閮藉彲鑳介犳垚浠誨姟涓嶈兘鎵ц瀹屾垚銆傚浣曟伆褰撳湴閫鍑轟換鍔℃槸涓涓緢甯歌鐨勯棶棰橈紝鑰屼笖瀹炵幇鏂規硶涔熶笉涓鑰岃凍銆?/span>

1. 浠誨姟
鍒涘緩涓涓茍鍙戜換鍔★紝閫掑綊鍦拌幏鍙栨寚瀹氱洰褰曚笅鐨勬墍鏈夊瓙鐩綍涓庢枃浠剁殑緇濆璺緞錛屾渶鍚庡啀灝嗚繖浜涜礬寰勪俊鎭繚瀛樺埌涓涓枃浠朵腑錛屽浠g爜娓呭崟1鎵紺猴細
娓呭崟1
public class FileScanner implements Runnable {

    
private File root = null;

    
private List<String> filePaths = new ArrayList<String>();

    
public FileScanner1(File root) {
        
if (root == null || !root.exists() || !root.isDirectory()) {
            
throw new IllegalArgumentException("root must be legal directory");
        }

        
this.root = root;
    }

    @Override
    
public void run() {
        travleFiles(root);
        
try {
            saveFilePaths();
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }

    
private void travleFiles(File parent) {
        String filePath 
= parent.getAbsolutePath();
        filePaths.add(filePath);

        
if (parent.isDirectory()) {
            File[] children 
= parent.listFiles();
            
for (File child : children) {
                travleFiles(child);
            }
        }
    }

    
private void saveFilePaths() throws IOException {
        FileWriter fos 
= new FileWriter(new File(root.getAbsoluteFile()
                
+ File.separator + "filePaths.out"));
        
for (String filePath : filePaths) {
            fos.write(filePath 
+ "\n");
        }
        fos.close();
    }
}

2. 鍋滄綰跨▼
鏈変竴涓緢鐩存帴錛屼篃寰堝共鑴嗙殑鏂瑰紡鏉ュ仠姝㈢嚎紼嬶紝灝辨槸璋冪敤Thread.stop()鏂規硶錛屽浠g爜娓呭崟2鎵紺猴細
娓呭崟2
public static void main(String[] args) throws Exception {
    FileScanner task 
= new FileScanner(new File("C:"));
    Thread taskThread 
= new Thread(task);
    taskThread.start();

    TimeUnit.SECONDS.sleep(
1);
    taskThread.stop();
}
浣嗘槸錛屽湴鐞冧漢閮界煡閬揟hread.stop()鍦ㄥ緢涔呭緢涔呬箣鍓嶅氨涓嶆帹鑽愪嬌鐢ㄤ簡銆傛牴鎹?a >瀹樻柟鏂囨。鐨勪粙緇嶏紝璇ユ柟娉曞瓨鍦ㄧ潃鍥烘湁鐨勪笉瀹夊叏鎬с傚綋鍋滄綰跨▼鏃訛紝灝嗕細閲婃斁璇ョ嚎紼嬫墍鍗犳湁鐨勫叏閮ㄧ洃瑙嗛攣錛岃繖灝變細閫犳垚鍙楄繖浜涢攣淇濇姢鐨勫璞$殑涓嶄竴鑷存с傚湪鎵ц娓呭崟2鐨勫簲鐢ㄧ▼搴忔椂錛屽畠鐨勮繍琛岀粨鏋滄槸涓嶇‘瀹氱殑銆傚畠鍙兘浼氳緭鍑轟竴涓枃浠訛紝鍏朵腑鍖呭惈閮ㄥ垎鐨勮鎵弿榪囩殑鐩綍鍜屾枃浠躲備絾瀹冧篃寰堟湁鍙兘浠涔堜篃涓嶈緭鍑猴紝鍥犱負鍦ㄦ墽琛孎ileWriter.write()鐨勮繃紼嬩腑錛屽彲鑳界敱浜庣嚎紼嬪仠姝㈣岄犳垚浜咺/O寮傚父錛屼嬌寰楁渶緇堟棤娉曞緱鍒拌緭鍑烘枃浠躲?/span>

3. 鍙彇娑堢殑浠誨姟
鍙﹀涓縐嶅崄鍒嗗父瑙佺殑閫斿緞鏄紝鍦ㄨ璁′箣鍒濓紝鎴戜滑灝變嬌浠誨姟鏄彲琚彇娑堢殑銆備竴鑸湴錛屽氨鏄彁渚涗竴涓彇娑堟爣蹇楁垨璁懼畾涓涓彇娑堟潯浠訛紝涓鏃︿換鍔¢亣鍒拌鏍囧織鎴栨弧瓚充簡鍙栨秷鏉′歡錛屽氨浼氱粨鏉熶換鍔$殑鎵ц銆傚浠g爜娓呭崟3鎵紺猴細
娓呭崟3
public class FileScanner implements Runnable {

    
private File root = null;

    
private List<String> filePaths = new ArrayList<String>();

    
private boolean cancel = false;

    
public FileScanner(File root) {
        
    }

    @Override
    
public void run() {
        
    }

    
private void travleFiles(File parent) {
        
if (cancel) {
            
return;
        }

        String filePath 
= parent.getAbsolutePath();
        filePaths.add(filePath);

        
if (parent.isDirectory()) {
            File[] children 
= parent.listFiles();
            
for (File child : children) {
                travleFiles(child);
            }
        }
    }

    
private void saveFilePaths() throws IOException {
        
    }

    
public void cancel() {
        cancel 
= true;
    }
}
鏂扮殑FileScanner瀹炵幇鎻愪緵涓涓猚ancel鏍囧織錛宼ravleFiles()浼氶亶鍘嗘柊鐨勬枃浠朵箣鍓嶆嫻嬭鏍囧織錛岃嫢璇ユ爣蹇椾負true錛屽垯浼氱珛鍗寵繑鍥炪備唬鐮佹竻鍗?鏄嬌鐢ㄦ柊浠誨姟鐨勫簲鐢ㄧ▼搴忋?/span>
娓呭崟4
public static void main(String[] args) throws Exception {
    FileScanner task 
= new FileScanner(new File("C:"));
    Thread taskThread 
= new Thread(task);
    taskThread.start();

    TimeUnit.SECONDS.sleep(
3);
    task.cancel();
}
浣嗘湁浜涙椂鍊欎嬌鐢ㄥ彲鍙栨秷鐨勪換鍔★紝騫朵笉鑳藉揩閫熷湴閫鍑轟換鍔°傚洜涓轟換鍔″湪媯嫻嬪彇娑堟爣蹇椾箣鍓嶏紝鍙兘姝e浜庣瓑寰呯姸鎬侊紝鐢氳嚦鍙兘琚樆濉炵潃銆傚娓呭崟2涓殑FileScanner紼嶄綔淇敼錛岃姣忔璁塊棶鏂扮殑鏂囦歡涔嬪墠鍏堢潯鐪?0縐掗挓錛屽浠g爜娓呭崟5鎵紺猴細
娓呭崟5
public class FileScanner implements Runnable {

    

    
private void travleFiles(File parent) {
        
try {
            TimeUnit.SECONDS.sleep(
10);
        } 
catch (InterruptedException e) {
            e.printStackTrace();
        }

        
if (cancel) {
            
return;
        }

        
    }

    
private void saveFilePaths() throws IOException {
        
    }

    
public void cancel() {
        cancel 
= true;
    }
}
鍐嶆墽琛屾竻鍗?涓殑搴旂敤紼嬪簭鏃訛紝鍙兘鍙戠幇浠誨姟騫舵病鏈夊緢蹇熺殑閫鍑猴紝鑰屾槸鍙堢瓑寰呬簡澶х害7縐掗挓鎵嶉鍑恒傚鏋滃湪媯鏌ancel鏍囧織涔嬪墠瑕佸厛鑾峰彇鏌愪釜鍙楅攣淇濇姢鐨勮祫婧愶紝閭d箞璇ヤ換鍔″氨浼氳闃誨錛屽茍涓旀棤娉曠‘瀹氫綍鏃惰兘澶熼鍑恒傚浜庤繖縐嶆儏鍐碉紝灝遍渶瑕佷嬌鐢ㄤ腑鏂簡銆?/span>

4. 涓柇
涓柇鏄竴縐嶅崗浣滄満鍒訛紝瀹冨茍涓嶄細鐪熸鍦板仠姝竴涓嚎紼嬶紝鑰屽彧鏄彁閱掔嚎紼嬮渶瑕佽涓柇錛屽茍灝嗙嚎紼嬬殑涓柇鐘舵佽緗負true銆傚鏋滅嚎紼嬫鍦ㄦ墽琛屼竴浜涘彲鎶涘嚭InterruptedException鐨勬柟娉曪紝濡俆hread.sleep()錛孴hread.join()鍜孫bject.wait()錛岄偅涔堝綋綰跨▼琚腑鏂椂錛屼笂榪版柟娉曞氨浼氭姏鍑篒nterruptedException錛屽茍涓斾腑鏂姸鎬佷細琚噸鏂拌緗負false銆備換鍔$▼搴忓彧瑕佹伆褰撳鐞嗚寮傚父錛屽氨鍙互姝e父鍦伴鍑轟換鍔°傚娓呭崟5鍐嶇◢浣滀慨鏀癸紝鍗籌紝濡傛灉浠誨姟鍦ㄧ潯鐪犳椂閬囦笂浜咺nterruptedException錛岄偅涔堝氨鍙栨秷浠誨姟銆傚浠g爜娓呭崟6鎵紺猴細
娓呭崟6
public class FileScanner implements Runnable {

    

    
private void travleFiles(File parent) {
        
try {
            TimeUnit.SECONDS.sleep(
10);
        } 
catch (InterruptedException e) {
            cancel();
        }

        
if (cancel) {
            
return;
        }

        
    }

    
}
鍚屾椂灝嗘竻鍗?涓殑搴旂敤紼嬪簭錛屾鏃跺皢璋冪敤Thread.interrupt()鏂規硶鍘諱腑鏂嚎紼嬶紝濡備唬鐮佹竻鍗?鎵紺猴細
娓呭崟7
public static void main(String[] args) throws Exception {
    FileScanner3 task 
= new FileScanner3(new File("C:"));
    Thread taskThread 
= new Thread(task);
    taskThread.start();

    TimeUnit.SECONDS.sleep(
3);
    taskThread.interrupt();
}
鎴栬呮洿榪涗竴姝ワ紝浠呬嬌鐢ㄤ腑鏂姸鎬佹潵鎺у埗紼嬪簭鐨勯鍑猴紝鑰屼笉鍐嶄嬌鐢ㄥ彲鍙栨秷鐨勪換鍔?鍗籌紝鍒犻櫎cancel鏍囧織)錛屽皢娓呭崟6涓殑FileScanner淇敼鎴愬涓嬶細
娓呭崟8
public class FileScanner implements Runnable {

    

    
private void travleFiles(File parent) {
        
try {
            TimeUnit.SECONDS.sleep(
10);
        } 
catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        
if (Thread.currentThread().isInterrupted()) {
            
return;
        }

        
    }

    
}
鍐嶆鎵ц娓呭崟7鐨勫簲鐢ㄧ▼搴忓悗錛屾柊鐨凢ileScanner涔熻兘鍗蟲椂鐨勯鍑轟簡銆傚煎緱娉ㄦ剰鐨勬槸錛屽洜涓哄綋sleep()鏂規硶鎶涘嚭InterruptedException鏃訛紝璇ョ嚎紼嬬殑涓柇鐘舵佸皢鍙堜細琚緗負false錛屾墍浠ュ繀欏昏鍐嶆璋冪敤interrupt()鏂規硶鏉ヤ繚瀛樹腑鏂姸鎬侊紝榪欐牱鍦ㄥ悗闈㈡墠鍙互鍒╃敤涓柇鐘舵佹潵鍒ゅ畾鏄惁闇瑕佽繑鍥瀟ravleFiles()鏂規硶銆傚綋鐒訛紝瀵逛簬姝ゅ鐨勪緥瀛愶紝鍦ㄦ敹鍒癐nterruptedException鏃朵篃鍙互閫夋嫨鐩存帴榪斿洖錛屽浠g爜娓呭崟9鎵紺猴細
娓呭崟9
public class FileScanner implements Runnable {

    

    
private void travleFiles(File parent) {
        
try {
            TimeUnit.SECONDS.sleep(
10);
        } 
catch (InterruptedException e) {
            
return;
        }

        
    }

    
}

5 灝忕粨
鏈枃浠嬬粛浜嗕笁縐嶇畝鍗曠殑閫鍑哄茍鍙戜換鍔$殑鏂規硶錛氬仠姝㈢嚎紼嬶紱浣跨敤鍙彇娑堜換鍔★紱浣跨敤涓柇銆傛鏃犵枒闂紝鍋滄綰跨▼鏄笉鍙彇鐨勩備嬌鐢ㄥ彲鍙栨秷鐨勪換鍔℃椂錛岃閬垮厤浠誨姟鐢變簬琚樆濉炶屾棤娉曞強鏃訛紝鐢氳嚦姘歌繙鏃犳硶琚彇娑堛備竴鑸湴錛屾伆褰撳湴浣跨敤涓柇鏄彇娑堜換鍔$殑棣栭夋柟寮忋?/span>


Sha Jiang 2013-09-21 19:11 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 久久久久久久久亚洲| 亚洲精品久久无码| 成年免费大片黄在线观看岛国| 亚洲AV日韩综合一区| 国产日产亚洲系列| 日韩亚洲国产高清免费视频| 黄页网站在线视频免费| 精品亚洲成a人片在线观看少妇| 国产精品免费视频一区| 无码国产精品一区二区免费3p | 真实乱视频国产免费观看| 韩国免费A级毛片久久| 国产亚洲精品影视在线| 亚洲人成人无码网www电影首页| 久久久久久久免费视频| 少妇性饥渴无码A区免费| 亚洲乱色熟女一区二区三区蜜臀| 国产亚洲精品xxx| 国产美女无遮挡免费网站| 久久国产色AV免费观看| 亚洲免费在线观看| 亚洲欧美日韩国产精品一区| 亚洲毛片在线观看| 亚洲人成无码网WWW| 天天天欲色欲色WWW免费| 99视频免费观看| 中文字幕在线视频免费| 老司机亚洲精品影院在线观看| 色噜噜综合亚洲av中文无码| 久久久久亚洲AV成人网| 免费观看的av毛片的网站| 最好看的中文字幕2019免费| 拍拍拍无挡视频免费观看1000| 亚洲AV香蕉一区区二区三区| 亚洲永久中文字幕在线| 亚洲AV午夜福利精品一区二区| 亚洲国产免费综合| 国产一级淫片免费播放| 成人男女网18免费视频| 黄瓜视频影院在线观看免费| 97久久免费视频|