java 內部類來將執行緒 程式碼隱藏在類中
阿新 • • 發佈:2018-12-26
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();; } }