线程的三种打开方式
开门见山
一、继承Thread类
public class MyThread extends Thread {
/**
* 线程要执行的任务方法
*/
@Override
public void run() {
//这里的代码就是一条新的执行路径
//这个路径的执行方式不是直接调用, 而是通过调用Thread对象的start()来启动任务
}
}
例如:
public static void main(String args[]) {
MyThread t = new MyThread();
t.start();//此行代码执行的就是你重写的run方法里的内容
}
二、实现Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
//同样需要重写run方法
}
}
实现了Runnable接口的线程开启方式略有不同:
Runnable r = new MyRunnable();//你可以把此行代码理解为创建了一个任务对象
Thread t = new Thread(r);//有了任务对象还不行,你还要指定谁去执行这个任务,那当然还是线程了
t.start();//依然是通过调用start方法来开启线程
优点:
1.通过创建任务,然后给线程分配任务的方式来实现多线程,更适合多个线程同时执行相同任务的情况
2.避免单继承的局限性
3.后面会简单介绍线程池,这个池子只接受Runnable类型的任务,不接受Thread类型
三、Callable-带返回值的线程
这东西也不难理解,区别就是任务完成后带着返回值再回到主线程
不多废话,直接上代码
public class MyCallable implements Callable<Integer> {
@Override
public Integer Call() {
//这里写你要执行的任务了,这个Call方法类比上面的Run方法,一个意思
}
}
在main方法里这么写:
Callable<Integer> c = new MyCallable();
FutureTask<Integer> task = new FutureTask<>(c);
new Thread(task).start();
对照着理解一下:首先你要new出一个Callable接口,再new一个FutureTask把这个接口包装成任务,再把这个任务放进Thread类里,然后才是执行(禁止套娃)
诶?上面不是说有返回值吗,我值呢?
不要着急,这个返回值比较害羞,你还要通过一个get方法取值,接着上面的代码写:
int ans = task.get();//返回整型
OK,说完了,东西不多也很简单,记录学习过程,共勉
诶等下,最近又学了一手匿名内部类,看一下:
new Thread(){
@Override
public void run() {
System.out.println("哈哈哈哈");
}
}.start();
上面这种方式当然属于继承Thread类了
本文详细介绍了Java中三种创建和启动线程的方法:继承Thread类、实现Runnable接口及使用Callable接口。对比了它们的特点,并提供了丰富的示例代码。





