ava中有哪几种方式来创建线程执行任务?
1. 继承Thread类
/**
* 作者:周瑜大都督
*/
public class ZhouyuThread extends Thread{
public static void main(string[] args) {
ZhouyuThread thread = new ZhouyuThread();
thread.start();
}
@Override
public void run() {
System.out.println("hello zhouyu");
}
}
总结:重写的是run()方法,而不是start()方法,但是占用了继承的名额,Java中的类是单继承的。
讲到单继承,我们应该注意,ava中的接口是可以多继承的
2. 实现Runnable接口
/**
* 作者:周瑜大都督
*/
public class ZhouyuThread implements Runnable{
public static void main(String[] args) {
Thread thread = new Thread(new ZhouyuThread());
thread.start();
}
public void run() {
System.out.println("hello zhouyu");
}
}
总结:实现Runnable接口,实现run()方法,使用依然要用到Thread,这种方式更常用
有时候,我们会直接使用匿名内部类的方式或者Lambda表达式的方式:
/**
* 作者:周瑜大都督
*/
public class ZhouyuThread {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
System.out.println("hello zhouyu");
}
});
thread.start();
}
}
public class ZhouyuThread {
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.println("hello zhouyu"));
thread.start();
}
}
3. 实现Callable接口
/**
* 作者:周瑜大都督
*/
public class ZhouyuThread implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new ZhouyuThread());
Thread thread = new Thread(futureTask);
thread.start();
String result = futureTask.get();
System.out.println(result);
}
public String call() {
return "hello zhouyu";
}
}
总结:实现Callable接口,实现call()方法,得使用Thread+FutureTask配合,这种方式支持拿到异步执行任务的结果
4. 利用线程池来创建线程
/**
* 作者:周瑜大都督
*/
public class ZhouyuThread implements Runnable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new ZhouyuThread());
}
public void run() {
System.out.println("hello zhouyu");
}
}
总结:实现Callable接口或者Runnable接口都可以,由ExecutorService来创建线程
注意,工作中不建议使用Executors来创建线程池
总结
以上几种方式,底层都是基于Runnable。