1. 程式人生 > >java 內部類來將執行緒 程式碼隱藏在類中

java 內部類來將執行緒 程式碼隱藏在類中

package org.rui.thread.basic;

import java.util.concurrent.TimeUnit;

/**
 * 有時通過使用內部類來將執行緒 程式碼隱藏在類中 將會很有用,就像下面這樣:
 * -----
 * InnerThread1建立了一個擴充套件自thread的匿名內部類,並且在構造器中建立了這個內部類的一個例項。
 * 如果內部類具有你在其他方法中需要訪問的特殊能力 (新方法) 
 * 那這麼做將會很有意義。但是,在大多數時候,建立執行緒的原因只是為了使用thread的能力,因此不必建立匿名內部類
 * 並且將其向上轉型為thread引用 t。 如果類中的其他方法需要訪問t 那它們可以通過thread介面來實現.
 * 並且不需要了解該物件的確切型別。
 *  該示例的第三個和第四個 類重複了前面的兩個類,但是它們使用的是runnable介面  而不是Thread類
 * 
 * @author lenovo
 *
 */
////////////InnerThread1///////////////////////////////
class InnerThread1{
	private int countDown=5;
	private Inner inner;

	public InnerThread1(String name){
		inner=new Inner(name);
	}
		//內部類
		private class Inner extends Thread
		{
			Inner(String name)
			{
				super(name);
			    start();
			}
			@Override
			public void run() {
				try {
					while(true)
					{
						System.out.println(this);
						if(--countDown==0)return;
						sleep(100);
					}
				} catch (InterruptedException e) {
					System.out.println("interrupted");
				}
			}
			
			public String toString(){return getName()+" : " +countDown; }
		}

}
	
	////////////InnerThread2///////////////////////////////
	class InnerThread2
	{
		private int countDown=5;
		private Thread t;
		
		public InnerThread2(String name){
		 t=new Thread(name)
		 {
			 @Override
			public void run() {
				try {
					while(true)
					{
						System.out.println(this);
						if(--countDown==0)return;
						sleep(10);
					}
				} catch (InterruptedException e) {
					System.out.println("interrupted");
				}
			}
			
			public String toString() {
				return getName()+" : "+countDown;
			}
		 };
		 t.start();
		}
	}
////////////InnerRunnable1///////////////////////////////
	class InnerRunnable1
	{
		private int countDown=5;
		private Inner inner;
		public InnerRunnable1(String name)
		{
			inner=new Inner(name);//例項內部類
		}
		//內部類實現執行緒
		private class Inner implements Runnable
		{
			Thread t;
			Inner(String name)
			{
				t=new Thread(this,name);
				t.start();
			}
			@Override
			public void run() {
				try {
					while(true)
					{
						System.out.println(this);
						if(--countDown==0)
						{
							return;
						}
						TimeUnit.MILLISECONDS.sleep(10);
					}
				} catch (Exception e) {
					System.out.println("interrupted");
				}
			}
			@Override
			public String toString() {
				return t.getName()+" : "+countDown;
			}
		}
	}
	
	////////////InnerRunnable1///////////////////////////////
	class InnerRunnable2
	{
		private int countDown=5;
		private Thread t;
		//構造器實現執行緒
		public InnerRunnable2(String name)
		{
			t=new Thread(new Runnable()
			{
				@Override
				public void run() 
				{
					try {
						while(true)
						{
							System.out.println(this);
							if(--countDown==0)
							{
								return;
							}
							TimeUnit.MILLISECONDS.sleep(10);
						}
					} catch (Exception e) {
						System.out.println("interrupted");
					}
				}
				@Override
				public String toString() 
				{
					return Thread.currentThread().getName()+" : "+countDown;
				}
				
			});
			
			t.start();
		}
	}
/////////////////////////////////a separate method to run some code as a task///////////////////////////////////////////////////
	class ThreadMethod
	{
		private int countDown=5;
		private Thread t;
		private String name;
		public ThreadMethod(String name){this.name=name;}
		
		public void runTask()
		{
			if(t==null)
			{
				t=new Thread(name)
				{
					@Override
					public void run() {
						try {
							while(true)
							{
								System.out.println(this);
								if(--countDown==0)return;
								sleep(10);
							}
						} catch (Exception e) {
							System.out.println("interrupted");
						}
					}
					@Override
					public String toString() 
					{
						return getName()+" : "+countDown;
					}
				};
				t.start();
			}
		}
	}
	
	
	/////////////////////////////////main///////////////////////////////////////////////////
public class ThreadVariations {
	
	public static void main(String[] args) 
	{
	    new InnerThread1("InnerTherad1");
	    new InnerThread2("InnerThread2");
	    new InnerRunnable1("InnerRunnable1");
	    new InnerRunnable2("InnerRunnable2");
	    new ThreadMethod("ThreadMethod").runTask();;
	}

}