import java.util.concurrent.TimeUnit;
/**
* InnerThread1 創建了一個擴展自Thread 的匿名內部類,
* 並且在構造器中創建了一個內部類的一個實例。如果內部類
* 具有你在其他方法中需要訪問的特殊能力(新方法),那這麼
* 做將會很有意義。但是,在大多數時候,創建線程的原因只是爲
* 了使用Thread的能力,因此不必要創建匿名內部類。
*
* @create @author Henry @date 2016-11-18
*/
// using a named inner class:
class InnerThread1 {
private int countDown = 5;
private Inner inner;
private class Inner extends Thread {
public Inner(String name) {
super(name);
start();
}
@Override
public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (InterruptedException e) {
System.out.println("interrupted");
}
}
@Override
public String toString() {
return getName() + ": " + countDown;
}
}
public InnerThread1(String name) {
inner = new Inner(name);
}
}
/**
* InnerThread2展示了可替換的方式:在構造器中創建一個匿名的Thread子類,
* 並且將其向上轉型爲Thread引用t.如果類中的其他方法需要訪問t,那它們可以
* 通過Thread接口來實現,並且不需要了解該對象的確切類型。
*
* @create @author Henry @date 2016-11-18
*
*/
// Using an anonymous inner class:
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("sleep() interrupted");
}
}
public String toString() {
return getName() + ":" + countDown;
};
};
t.start();
}
}
/**
* 參考InnerThread1
*
* @create @author Henry @date 2016-11-18
*
*/
// Using a named Runnable implememtation
class InnerRunnable1 {
private int countDown = 5;
private Inner inner;
private class Inner implements Runnable {
Thread t;
public 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 (InterruptedException e) {
System.out.println("sleep() interrupted");
}
}
@Override
public String toString() {
return t.getName() + ":" + countDown;
}
}
public InnerRunnable1(String name) {
inner = new Inner(name);
}
}
/**
* 參考InnerThread2
*
* @create @author Henry @date 2016-11-18
*
*/
// Using an anonymous Runnable implementation:
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 (InterruptedException e) {
System.out.println("sleep() interrupted");
}
}
@Override
public String toString() {
return Thread.currentThread().getName() + ":" + countDown;
}
}, name);
t.start();
}
}
/**
* ThreadMethod類展示了在方法內部如何創建線程。當你準備好運行線程時,
* 就可以調用這個方法,而在線程開始之後,該方法將返回。如果該線程只執行輔助操作,
* 而不是該類的重要操作,那麼這與在該類的構造器內部啓動線程相比,
* 可能是一種更加有用而適合的方式。
*
* @create @author Henry @date 2016-11-18
*
*/
// A separate method to run some code as a tack:
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) {
public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
TimeUnit.MILLISECONDS.sleep(10);
}
} catch (InterruptedException e) {
System.out.println("sleep() interrupted");
}
}
public String toString() {
return getName() + ":" + countDown;
};
};
t.start();
}
}
}
/**
* 在構造器中啓動線程可能會變得很有問題,因爲另一個任務可能會在構造器結束之前
* 開始執行,這意味着該任務能夠訪問處於不穩定狀態的對象。這是優先Executor而不
* 是顯式地創建Thread對象的另一個原因。
* 有時通過使用內部類來將線程代碼隱藏在類中將會很有用,就像如下這樣:
*
* @create @author Henry @date 2016-11-18
*/
public class ThreadVariations {
public static void main(String[] args) {
new InnerThread1("InnerThread1");
new InnerThread2("InnerThread2");
new InnerRunnable1("InnerRunnable1");
new InnerRunnable2("InnerRunnable2");
new ThreadMethod("ThreadMethod").runTask();
}
}
java 多線程 內部類實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.