java.lang.Runnable 是一個由類實現的接口,該類的實例旨在由線程執行。有兩種方法可以啟動新線程 - 子類化 Thread 並實現 Runnable。當任務可以通過僅重寫 Runnable 的 run() 方法來完成時,不需要子類化 Thread。
使用 Runnable 創建新線程的步驟
- 創建一個 Runnable 實現者並實現 run() 方法。
- 實例化 Thread 類並將實現者傳遞給 Thread,Thread 有一個接受 Runnable 實例的構造函數。
- 調用Thread實例的start(),start內部調用實現者的run()。調用 start() 創建一個新線程,執行 run() 中編寫的代碼。直接調用run()不會創建並啟動新線程,它將在同一個線程中運行。要開始新的執行行,請在線程上調用start()。
示例 1
Java
public class RunnableDemo {
public static void main(String[] args)
{
System.out.println("Main thread is- "
+ Thread.currentThread().getName());
Thread t1 = new Thread(new RunnableDemo().new RunnableImpl());
t1.start();
}
private class RunnableImpl implements Runnable {
public void run()
{
System.out.println(Thread.currentThread().getName()
+ ", executing run() method!");
}
}
}
輸出:
Main thread is- main Thread-0, executing run() method!
輸出顯示程序中的兩個活動線程 - 主線程和 Thread-0,main 方法由主線程執行,但調用 RunnableImpl 上的啟動會創建並啟動一個新線程 - Thread-0。當 Runnable 遇到異常時會發生什麽? Runnable 不能拋出已檢查異常,但可以從 run() 拋出 RuntimeException。未捕獲的異常由線程的異常處理程序處理,如果 JVM 無法處理或捕獲異常,它將打印堆棧跟蹤並終止流程。
示例 2
Java
import java.io.FileNotFoundException;
public class RunnableDemo {
public static void main(String[] args)
{
System.out.println("Main thread is- " +
Thread.currentThread().getName());
Thread t1 = new Thread(new RunnableDemo().new RunnableImpl());
t1.start();
}
private class RunnableImpl implements Runnable {
public void run()
{
System.out.println(Thread.currentThread().getName()
+ ", executing run() method!");
/**
* Checked exception can't be thrown, Runnable must
* handle checked exception itself.
*/
try {
throw new FileNotFoundException();
}
catch (FileNotFoundException e) {
System.out.println("Must catch here!");
e.printStackTrace();
}
int r = 1 / 0;
/*
* Below commented line is an example
* of thrown RuntimeException.
*/
// throw new NullPointerException();
}
}
}
輸出:
Thread-0, executing run() method! Must catch here! java.io.FileNotFoundException at RunnableDemo$RunnableImpl.run(RunnableDemo.java:25) at java.lang.Thread.run(Thread.java:745) Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero at RunnableDemo$RunnableImpl.run(RunnableDemo.java:31) at java.lang.Thread.run(Thread.java:745)
輸出顯示 Runnable 無法拋出檢查異常,在本例中為FileNotFoundException,對於調用者來說,它必須處理 run() 中的檢查異常,但 RuntimeExceptions(拋出或自動生成)由 JVM 自動處理。
相關用法
- Java Runtime maxMemory()用法及代碼示例
- Java Runtime gc()用法及代碼示例
- Java Runtime getRuntime()用法及代碼示例
- Java Runtime freeMemory()用法及代碼示例
- Java Runtime halt()用法及代碼示例
- Java Runtime load()用法及代碼示例
- Java Runtime runFinalization()用法及代碼示例
- Java Runtime availableProcessors()用法及代碼示例
- Java Runtime exit()用法及代碼示例
- Java RuleBasedCollator clone()用法及代碼示例
- Java RuleBasedCollator compare()用法及代碼示例
- Java RuleBasedCollator equals()用法及代碼示例
- Java RuleBasedCollator getCollationElementIterator(CharacterIterator)用法及代碼示例
- Java RuleBasedCollator getCollationElementIterator(String)用法及代碼示例
- Java RuleBasedCollator getCollationKey()用法及代碼示例
- Java RuleBasedCollator getRules()用法及代碼示例
- Java RuleBasedCollator hashCode()用法及代碼示例
- Java Random doubles()用法及代碼示例
- Java Random nextInt()用法及代碼示例
- Java Reentrant getQueueLength()用法及代碼示例
- Java ReentrantLock getHoldCount()用法及代碼示例
- Java ReentrantLock getOwner()用法及代碼示例
- Java ReentrantLock hasQueuedThread()用法及代碼示例
- Java ReentrantLock hasQueuedThreads()用法及代碼示例
- Java ReentrantLock isFair()用法及代碼示例
注:本文由純淨天空篩選整理自javargon大神的英文原創作品 Runnable interface in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。