创建线程有哪几种方式
【得分点】
Thread、Runnable、Callable
【参考答案】
标准回答
创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。
1. 通过继承Thread类来创建线程的步骤如下:
o 定义Thread类的子类,并重写该类的run()方法,该方法将作为线程执行体。
o 创建Thread子类的实例,即创建了线程对象。
o 调用线程对象的start()方法来启动该线程。
2. 通过实现Runnable接口来创建线程的步骤如下:
o 定义Runnable接口的实现类,并实现该接口的run()方法,该方法将作为线程执行体。
o 创建Runnable实现类的实例,并将其作为参数来创建Thread对象,Thread对象为线程对象。
3. 通过实现Callable接口来创建线程的步骤如下:
o 定义Callable接口的实现类,并实现call()方法,该方法将作为线程执行体。
o 创建Callable实现类的实例,并以该实例作为参数,创建FutureTask对象。
o 使用FutureTask对象作为参数,创建Thread对象,然后启动线程。
o 调用FutureTask对象的get()方法,获得子线程执行结束后的返回值。
加分回答
采用接口的方式创建线程,优点是线程类还可以继承于其他类,并且多个线程可以共享一个线程体,适合多个线程处理同一份资源的情况。缺点是编程稍微麻烦一点点。
采用继承的方式创建线程,优点是编程稍微简单一点点。缺点是因为线程类已经继承了Thread类,所以就不能继承其他的父类了。
所以,通常情况下,更推荐采用接口的方式来创建线程。如果需要返回值,就使用Callable接口,否则使用Runnable接口即可。
【延伸阅读】
public class ThreadDemo1 { public static void main(String[] args) throws Exception { // 1 new First().start(); // 2 new Thread(new Second()).start(); // 3 FutureTask<String> task = new FutureTask<>(new Third()); new Thread(task).start(); // 阻塞方法 System.out.println("返回值: " + task.get()); private static class First extends Thread { @Override public void run() { System.out.println("First: " + Thread.currentThread().getName()); } } private static class Second implements Runnable { @Override public void run() { System.out.println("Second: " + Thread.currentThread().getName()); } } private static class Third implements Callable<String> { @Override public String call() throws Exception { System.out.println("Third: " + Thread.currentThread().getName()); return Thread.currentThread().getName(); } } }
public class ThreadDemo1 {
public static void main(String[] args) throws Exception {
// 1
new First().start();
// 2
new Thread(new Second()).start();
// 3
FutureTask<String> task = new FutureTask<>(new Third());
new Thread(task).start();
// 阻塞方法
private static class First extends Thread {
@Override
public void run() {
System.out.println("First: " + Thread.currentThread().getName());
}
private static class Second implements Runnable {
System.out.println("Second: " + Thread.currentThread().getName());
private static class Third implements Callable<String> {
public String call() throws Exception {
System.out.println("Third: " + Thread.currentThread().getName());
return Thread.currentThread().getName();
First: Thread-0 Second: Thread-1 Third: Thread-2 返回值: Thread-2
First: Thread-0
Second: Thread-1
Third: Thread-2
返回值: Thread-2
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
【得分点】
Thread、Runnable、Callable
【参考答案】
标准回答
创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。
1. 通过继承Thread类来创建线程的步骤如下:
o 定义Thread类的子类,并重写该类的run()方法,该方法将作为线程执行体。
o 创建Thread子类的实例,即创建了线程对象。
o 调用线程对象的start()方法来启动该线程。
2. 通过实现Runnable接口来创建线程的步骤如下:
o 定义Runnable接口的实现类,并实现该接口的run()方法,该方法将作为线程执行体。
o 创建Runnable实现类的实例,并将其作为参数来创建Thread对象,Thread对象为线程对象。
o 调用线程对象的start()方法来启动该线程。
3. 通过实现Callable接口来创建线程的步骤如下:
o 定义Callable接口的实现类,并实现call()方法,该方法将作为线程执行体。
o 创建Callable实现类的实例,并以该实例作为参数,创建FutureTask对象。
o 使用FutureTask对象作为参数,创建Thread对象,然后启动线程。
o 调用FutureTask对象的get()方法,获得子线程执行结束后的返回值。
加分回答
采用接口的方式创建线程,优点是线程类还可以继承于其他类,并且多个线程可以共享一个线程体,适合多个线程处理同一份资源的情况。缺点是编程稍微麻烦一点点。
采用继承的方式创建线程,优点是编程稍微简单一点点。缺点是因为线程类已经继承了Thread类,所以就不能继承其他的父类了。
所以,通常情况下,更推荐采用接口的方式来创建线程。如果需要返回值,就使用Callable接口,否则使用Runnable接口即可。
【延伸阅读】