當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java Runnable用法及代碼示例


java.lang.Runnable 是一個由類實現的接口,該類的實例旨在由線程執行。有兩種方法可以啟動新線程 - 子類化 Thread 並實現 Runnable。當任務可以通過僅重寫 Runnable 的 run() 方法來完成時,不需要子類化 Thread。

使用 Runnable 創建新線程的步驟

  1. 創建一個 Runnable 實現者並實現 run() 方法。
  2. 實例化 Thread 類並將實現者傳遞給 Thread,Thread 有一個接受 Runnable 實例的構造函數。
  3. 調用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 自動處理。



相關用法


注:本文由純淨天空篩選整理自javargon大神的英文原創作品 Runnable interface in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。