JAVA 三种线程实现创建方式
JAVA 三种线程实现/创建方式
方式一:继承Thread类
通过继承Thread类来创建一个自定义线程类。Thread类本质上就继承了Runable接口,代表一个线程类。启动线程的唯一办法就是通过Thread类的start()实例方法。start()方法是一个 native 方法(本地方法),它将启动一个新线程,并执行 run()方法。
public class MyThread extends Thread {
//重写父类的run方法,实现自定义线程操作
public void run() {
System.out.println("MyThread.run()");
}
public static void main(String[] args){
MyThread myThread1 = new MyThread();
//通过start()启动线程
myThread1.start();
}
}
Java只支持单继承,这也导致了如果使用继承Thread类创建的线程,就无法继承其他类,这也是不推荐使用Thread类创建线程的原因之一。
方式二:实现Runnable接口
如果自己的类已经 extends 另一个类,就无法直接 extends Thread,此时,可以实现一个Runnable 接口来避免这种情况。
public class MyThread implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
public static void main(String[] args){
MyThread myThread1 = new MyThread();
//传入实现runnable接口的实例
Thread thread = new Thread(myThread);
//通过start()启动线程
thread.start();
}
}
我们也可以写成这样
public class MyThread{
public static void main(String[] args){
//直接通过匿名类创建线程
Thread thread = new Thread(new Runnable(){
public void run() {
System.out.println("MyThread.run()");
}
});
//通过start()启动线程
thread.start();
//或者使用lambda表达式,这样更加便捷
Thread thread2 = new Thread(()->{
System.out.println("MyThread.run()");
})
thread2.start();
}
}
方式三:通过ExecutorService、Callable、Future创建有返回值线程
有返回值的任务必须实现 Callable 接口,类似的,无返回值的任务必须 Runnable 接口。执行Callable 的任务后会放回一个Future 的对象,而这个Future对象上调用 get 就可以获取到 Callable 任务返回的 Object 了。线程池接口 ExecutorService定义了执行Callable接口的方法。
ExecutorService接口定义了submit()方法用于接受提交到线程池的任务,并放回一个Future对象。
Future对象用于获取线程任务放回值,我们通过Future对象的get方法获取放回值。
//创建一个大小为5的线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
// 向线程池提交一个执行任务并获取 Future 对象
Future f = pool.submit(new Callable(){
public int call() {
System.out.println("MyThread.run()");
return 10;
}
});
// 关闭线程池
pool.shutdown();
// 获取所有并发任务的运行结果
for (Future f : list)
// 从 Future 对象上获取任务的返回值,并输出到控制台
System.out.println("res:" + f.get().toString());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)