实现Callable接口和Future来创建线程的步骤:1、定义Callable实现类,重写call()方法,该方法实际是等同于Runnable接口中的run()方法,即线程执行体. 2、创建FutureTask对象,并将Callable实现类的实例传入作为参数. 3、将FutureTask对象作为Thread类的参数传入,即创建了线程对象. 4、启动线程,即调用线程的start()方法. 示例代码为: class CallableDemo implements Callable<Integer> { public static void main(String[] args) throws ExecutionException, InterruptedException { FirstDemo fd = new FirstDemo(); FutureTask<Integer> ft = new FutureTask<>(fd); Thread t = new Thread(ft); t.start(); System.out.println("主线程"); } public Integer call() throws Exception { int sum = 0; for (int i = 0; i < 100; i++) { sum += i; } return sum; } }
在Java中,线程的创建主要有三种方式,它们分别是继承Thread类创建线程、实现Runnable接口创建线程和使用Callable和Future创建线程,具体如下:
1、继承Thread类创建线程
定义子类并重写run()方法:需要定义一个继承自Thread类的子类,并重写其run()方法,这个方法包含了线程执行的代码。
创建Thread子类的实例:实例化这个子类,就等同于创建了一个线程对象。
启动线程:通过调用线程对象的start()方法,可以启动这个线程,线程随即执行run()方法内的代码。
特点:这种方式的特点是简单直观,但因为Java不支持多重继承,因此如果线程类需要继承其他类,则不能使用这种方式。
示例代码:以下是一个简单的示例,展示如何通过继承Thread类来创建和启动一个线程:
“`java
class MyThread extends Thread {
public void run(){
// 线程执行体
}
}
MyThread myThread = new MyThread();
myThread.start(); // 启动线程
“`
2、实现Runnable接口创建线程
实现Runnable接口:创建一个实现Runnable接口的类,然后重写run()方法,这个方法中定义了线程要执行的逻辑。
创建Runnable实例:实例化这个实现了Runnable接口的类。
包装成Thread对象:需要把这个实例包装成一个Thread对象。
启动线程:通过调用Thread对象的start()方法来启动线程。
特点:这种方式支持并发处理,因为Runnable实例可以单独存在,与线程对象是分离的,可以让多个线程共享同一个Runnable实例。
示例代码:以下是一个示例,展示如何通过实现Runnable接口来创建和启动一个线程:
“`java
class MyRunnable implements Runnable {
public void run(){
// 线程执行体
}
}
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动线程
“`
3、使用Callable和Future创建线程
实现Callable接口:创建一个实现Callable接口的类,并重写call()方法,这个方法可以有返回值,并且可以抛出异常。
创建FutureTask对象:需要将Callable的实现类实例传递给FutureTask构造器,从而创建一个FutureTask对象。
包装成Thread对象:将FutureTask对象作为Thread类的参数传入,实例化Thread类。
启动线程:通过Thread对象的start()方法来启动线程。
获取结果:可以通过Future对象的get()方法来获取call()方法的返回值,这个方法会阻塞直到线程执行结束并且有结果返回。
特点:Callable和Future的组合提供了更加强大的线程执行能力,包括返回执行结果和处理异常。
示例代码:以下是一个示例,展示如何使用Callable和Future来创建和启动一个线程:
“`java
class CallableDemo implements Callable<Integer> {
public Integer call() throws Exception {
// 线程执行体,可以返回结果
}
}
FutureTask<Integer> futureTask = new FutureTask<>(new CallableDemo());
Thread thread = new Thread(futureTask);
thread.start(); // 启动线程
// … 其他操作
try {
Integer result = futureTask.get(); // 获取线程执行的结果
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
“`
综上,Java中创建线程的三种方式各有特点,适应不同的场景需求,在实际开发中,应根据具体情况选择合适的线程创建方式,如果希望线程能够返回执行结果或处理异常,可以选择使用Callable和Future的方式,而如果只需要简单的并行执行任务,则可以选择继承Thread类或实现Runnable接口的方式。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/792259.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复