大家好,我是程序员影子
一名致力于帮助更多朋友快速入门编程的程序猿
今天来聊一聊关于Java 中的线程的三种创建和启动方式
一、通过继承 Thread
类
这是最直接的方式,通过创建一个新的类,继承自Thread
类,并重写run()
方法。然后创建该类的实例,并调用start()
方法来启动线程。
csharp
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("MyThread: " + i);
}
}
}
public class CreateThreadByExtendingExample {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start(); // 启动线程
}
}
二、通过实现 Runnable
接口
这是推荐的方式,通过创建一个新的类,实现Runnable
接口,并实现run()
方法。然后将该类的实例传递给Thread
对象,并调用start()
方法来启动线程。
typescript
class MyRunnable implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("MyRunnable: " + i);
}
}
}
public class CreateRunnableExample {
public static void main(String[] args) {
Thread t2 = new Thread(new MyRunnable());
t2.start(); // 启动线程
}
}
三、通过 Executor
框架和 Callable
接口
Callable
接口与Runnable
类似,但它有一个call()
方法,该方法在执行线程任务时可以返回结果或抛出异常。Executor
框架是Java 5引入的,用于管理线程池。它允许你提交Runnable
或Callable
任务,而不需要直接管理线程。
java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class MyCallable implements Callable<Integer> {
public Integer call() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
return sum;
}
}
public class CallableExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
Future<Integer> future = executor.submit(new MyCallable());
try {
Integer result = future.get(); // 获取异步执行的结果
System.out.println("异步计算结果:" + result);
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown(); // 关闭线程池
}
}
在这个例子中,我们创建了一个Callable
任务,它计算1到10的整数和。然后我们使用ExecutorService
的submit()
方法来提交这个任务,并获取一个Future
对象。通过Future
对象的get()
方法,我们可以等待任务完成并获取结果。
以上三种方式都可以创建和启动线程,但实现Runnable
接口的方式更为灵活,并且Executor
框架提供了更高级的线程管理功能,可以更好地控制线程池的大小和管理线程的生命周期。
以上就是本次分享的所有内容,感兴趣的朋友点个关注呀,感谢大家啦~
更多Java | AI+编程玩法 的相关资料和源码请移步至公众号:程序员影子