スレッドタイムアウトの解放

7969 ワード

スレッドプールのスレッドリソースが消費され、スレッドが解放されない場合は、深刻な問題に違いありません.考え方:1.新FixedThreadPoolのFutureクラスgetメソッドでは、インタフェースgetが所定の時間に完了しないとthrowsタイムアウト異常を設定できます.
   /**
     * Waits if necessary for at most the given time for the computation
     * to complete, and then retrieves its result, if available.
     *
     * @param timeout the maximum time to wait
     * @param unit the time unit of the timeout argument
     * @return the computed result
     * @throws CancellationException if the computation was cancelled
     * @throws ExecutionException if the computation threw an
     * exception
     * @throws InterruptedException if the current thread was interrupted
     * while waiting
     * @throws TimeoutException if the wait timed out
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;


2.モニタスレッドを自分で書きます.demoは以下の通りです.
package filesearch;

public class StopTest {
	public static void main(String[] args) {
		int i = 1;
		/**
		 *  
		 * ---args---  
		 */
		WorkThread ct = new StopTest().new WorkThread("---args---");
		ct.start();
		/**
		 *  , :
		 * 1) , stop, break, 
		 * 2) ,while , 
		 */
		while(ct.isAlive()){
			i++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(""+i);
			if(i>10){
				ct.stop();
				break;
			}
		}
		
	}
	class WorkThread extends Thread {
		String str ;
		WorkThread(String str1){str=str1;}
		public void run() {
			try {
				System.out.println("arg:"+str);
				System.out.println("begin");
				Thread.sleep(8000);
				System.out.println("end");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}