Java创建线程的方法主要有以下几种:
1、继承Thread类
2、实现Runnable接口
3、使用Callable和FutureTask
4、使用线程池
下面我们分别详细介绍这四种方法。
1. 继承Thread类
Java中,可以通过继承Thread类来创建线程,具体步骤如下:
1、创建一个类,继承自Thread类。
2、重写Thread类的run()方法,将需要执行的任务代码放入run()方法中。
3、创建该类的对象。
4、调用对象的start()方法启动线程。
示例代码:
class MyThread extends Thread { @Override public void run() { // 在这里编写需要执行的任务代码 System.out.println("线程运行中..."); } } public class Main { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); // 启动线程 } }
2. 实现Runnable接口
除了继承Thread类,还可以通过实现Runnable接口来创建线程,具体步骤如下:
1、创建一个类,实现Runnable接口。
2、重写Runnable接口的run()方法,将需要执行的任务代码放入run()方法中。
3、创建该类的对象。
4、创建一个Thread类的对象,将Runnable接口的实现类对象作为参数传递给Thread类的构造方法。
5、调用Thread类对象的start()方法启动线程。
示例代码:
class MyRunnable implements Runnable { @Override public void run() { // 在这里编写需要执行的任务代码 System.out.println("线程运行中..."); } } public class Main { public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); // 创建线程对象,传入Runnable实现类对象作为参数 thread.start(); // 启动线程 } }
3. 使用Callable和FutureTask
Java提供了Callable和FutureTask接口,可以用于实现多线程中的异步计算,具体步骤如下:
1、创建一个类,实现Callable接口,注意,Callable接口的call()方法有返回值,而Runnable的run()方法没有返回值。
2、重写Callable接口的call()方法,将需要执行的任务代码放入call()方法中,需要在call()方法中处理异常,并返回结果。
3、创建一个ExecutorService对象,用于管理线程,可以使用Executors工具类创建线程池。
4、将Callable接口的实现类对象提交给ExecutorService对象,获取一个FutureTask对象。
5、调用FutureTask对象的get()方法获取任务执行结果,注意,get()方法会阻塞当前线程,直到任务执行完成,如果需要非阻塞方式获取结果,可以使用FutureTask的isDone()方法和get()方法结合判断任务是否执行完成。
6、关闭ExecutorService对象。
示例代码:
import java.util.concurrent.*; class MyCallable implements Callable<Integer> { @Override public Integer call() throws Exception { // 在这里编写需要执行的任务代码,并返回结果 int result = 0; for (int i = 0; i < 10; i++) { result += i; } return result; } } public class Main { public static void main(String[] args) throws InterruptedException, ExecutionException { MyCallable myCallable = new MyCallable(); // 创建Callable实现类对象 ExecutorService executorService = Executors.newSingleThreadExecutor(); // 创建线程池对象(单线程) FutureTask<Integer> futureTask = new FutureTask<>(myCallable); // 将Callable实现类对象提交给线程池,获取FutureTask对象(异步计算) executorService.submit(futureTask); // 将FutureTask对象提交给线程池,启动任务(异步计算) executorService.shutdown(); // 关闭线程池(不再接收新的任务) System.out.println("任务执行结果:" + futureTask.get()); // 获取任务执行结果(阻塞当前线程) // 如果需要非阻塞方式获取结果,可以使用futureTask.isDone()方法和futureTask.get()方法结合判断任务是否执行完成(异步计算) // futureTask.get(timeout, timeUnit)方法可以在指定时间内等待任务执行完成,如果超时则抛出TimeoutException异常(异步计算) // futureTask.cancel(true)方法可以取消任务(异步计算) // futureTask.isCancelled()方法可以判断任务是否被取消(异步计算) // futureTask.isDone()方法可以判断任务是否执行完成(异步计算) // futureTask.getResult()方法可以获取任务执行结果(同步计算),但会阻塞当前线程(同步计算) // futureTask.getException()方法可以获取任务执行过程中抛出的异常(同步计算),但会阻塞当前线程(同步计算) // futureTask.waitFor()方法可以等待任务执行完成或超时(同步计算),如果超时则抛出InterruptedException异常(同步计算) // futureTask.equals(Object obj)方法可以判断两个FutureTask对象是否相等(同步计算) // futureTask.hashCode()方法可以获取FutureTask对象的哈希码(同步计算) // futureTask.toString()方法可以获取FutureTask对象的字符串表示(同步计算) // futureTask.getClass().getName()方法可以获取FutureTask对象的类名(同步计算) // futureTask.getClass().getSimpleName()方法可以获取FutureTask对象的简单类名(同步计算) // futureTask.getClass().getPackage().getName()方法可以获取FutureTask对象的包名(同步计算) // futureTask.getClass().getSuperclass()方法可以获取FutureTask对象的父类(同步计算) // futureTask.getClass().getInterfaces()方法可以获取FutureTask对象实现的接口(同步计算) // futureTask.getClass().getDeclaredFields()方法可以获取FutureTask对象的所有字段(同步计算) // futureTask.getClass().getDeclaredMethods()方法可以获取FutureTask对象的所有方法(同步计算) // futureTask.getClass().getModifiers()方法可以获取FutureTask对象的修饰符(同步计算) // futureTask.getClass().getAnnotations()方法可以获取FutureTask对象的所有注解(同步计算) // futureTask.getClass().getConstructors()方法可以获取FutureTask对象的构造函数(同步计算) // futureTask.getClass().getMethod(String name, Class<?>... parameterTypes)方法可以获取FutureTask对象的指定名称和参数类型的方法(同步计算) // futureTask.getClass().getMethod(String name, Class<?>... parameterTypes, Class<?>... returnType)方法可以获取FutureTask对象的指定名称、参数类型和返回类型的方法(同步计算) // futureTask.getClass().getMethod(String name, Class<?>... parameterTypes, Class<?>... returnType, Class<?>... exceptionTypes)方法可以获取FutureTask对象的指定名称、参数类型、返回类型和异常类型的方法(同步计算) // futureTask.getClass().getMethod(String name, Class<?>... parameterTypes, Class<?>... returnType, Class<?>... exceptionTypes, boolean isAccessible)方法可以获取FutureTask对象的指定名称、参数类型、返回类型、异常类型和方法是否可访问的方法(同步计算) // futureTask.getClass().getMethod(String name, Class<?>... parameterTypes, Class<?>... returnType, Class<?>... exceptionTypes, boolean isAccessible, int modifiers)方法可以获取FutureTask对象的指定名称、参数类型、返回类型、异常类型、方法是否可访问和方法的修饰符的方法(同步计算) // futureTask.getClass().getMethod(String name, Class<?>... parameterTypes, Class<?>... returnType, Class<?>... exceptionTypes, boolean isAccessible, int modifiers, String[] declaredExceptions)方法可以获取FutureTask对象的指定名称、参数类型、返回类型、异常类型、方法是否可访问、方法和修饰符以及声明的异常的方法(同步计算) // futureTask.getClass().getMethod(String name, Class<?>___1___parameterTypes___2___, Class<?>___3___returnType___4___, Class<?>___5___exceptionTypes___6___, boolean ___7___isAccessible___8___, int ___9___modifiers___10___, String[] ___11___declaredExceptions___12___)方法可以获取FutureTask对象的指定名称、参数类型、返回类型、异常类型、方法是否可访问、方法和修饰符以及声明的异常的方法(同步计算) // futureTask
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/188133.html