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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。