Java中有哪几种方式来创建线程执行任务
1.继承Thread类
继承Thread类,重写run方法,其底层原理仍然是实现 Runnable接口,缺点:占用继承名额。
public class MyThread extends Thread{
public static void main(String[] args) {
MyThred myThred = new MyThred();
myThred.start();
}
@Override
public void run() {
System.out.println("执行了....");
}
}
2.实现Runnable接口
实现Runnable接口,然后再实现run方法
public class MyThread implements Runnable{
public static void main(String[] args) {
Thread thread = new Thread(new MyThread());
thread.start();
}
@Override
public void run() {
System.out.println("执行了...");
}
}
也可以用匿名内部类的方式
public class MyThread{
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("执行了...");
}
});
thread.start();
}
}
或者用Lambda表达式的方式
public class MyThread{
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.println("执行了..."));
thread.start();
}
}
3.实现Callable接口
Callable接口可以通过创建一个线程并执行任务,最后可以拿到这个任务执行的结果。
创建对应实现类,并将对应实现类传给futureTask,并将futureTask传给thread。在启动线程之后,如果想要获得结果,可以通过对应的get方法来阻塞式获得结果。
原理, FutureTask实现的是 RunnableFuture接口。而RunnableFuture接口实现的是 Runnable和Future接口。
public class MyThread implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new MyThread());
Thread thread = new Thread(futureTask);
thread.start();
String result =futureTask.get();
System.out.println(result);
}
@Override
public String call(){
return "result";
}
}
4.利用线程池来创建线程
已有线程池。提交一个任务,其本质上还是一个 Runnable。线程池会帮我们创建一个线程,然后执行我们的任务。
(不建议使用Executors来创建线程池,推荐使用ThreadPoolExecutor)
public class MyThread implements Runnable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new MyThread());
}
@Override
public void run() {
System.out.println("执行了...");
}
}