创建线程的四种方式(省略start)
- 继承Thread,对run进行重写
- A实现Runnable.然后利用A的实例创建Thread实例
-
- A实现Callable,对call重写, A的实例放入FutureTask构造器创建实例ft,ft放入Thread构造器 创建线程。
- 获取返回值: 调用FutureTask实例的get方法
-
- 声明线程池 ExecutorService e = Executors.newFixedThreadPool(5);
- 传入接口实现类 execute(Runnable)或者 submit(Callable)
- 关闭线程池 shutdown();
补充
- 1.第一种是是直接对Thread的run方法进行重写
- 2.第二种是对Thread下的target在初始化时赋值,run调用target的run方法
- 优点
接口可以多继承
- 优点
- 3.第三种 A的实例赋给了ft中的callable,在run中执行callable.call(),
- 优点
泛型 支持泛型返回值
异常 可以抛异常
返回值 可以返回返回值
- 优点
- 4.第四种
- 优点
启动快 不用新建线程
消耗资源少 线程重用
便于管理
- 优点
注意
1.第三种方法get要再start之后,如果call没有执行,get什么都调不到,主线程阻塞。
2.线程池用完关闭
package 线程;
import org.junit.jupiter.api.Test;
import java.lang.Thread;
import java.util.concurrent.*;
import java.util.logging.Filter;
/*
*/
public class ThreadCreateTest {
@Test
void Test1(){
class A extends Thread {
@Override
public void run() {
System.out.println("A");
}
}
new A().start();
}
//2.Runnable接口
@Test
void Test2(){
// 第一种写法
class B implements Runnable{
@Override
public void run() {
System.out.println("B");
}
}
Thread t1 = new Thread(new B());
t1.start();
// 第二种写法
Thread t2 = new Thread(()-> System.out.println("B"));
t2.start();
}
// Callable接口(不再演示第二种写法)
@Test
void Test3() throws Exception {
class C implements Callable<String>{
@Override
public String call() throws Exception {
return "C";
}
}
FutureTask<String> ft = new FutureTask<>(new C());
Thread t = new Thread(ft);
t.start();
System.out.println(ft.get());
}
@Test
void Test4(){
ExecutorService e = Executors.newFixedThreadPool(5);
e.execute(()-> System.out.println("D"));
// e.submit(Callable);
e.shutdown();
}
public static void main(String[] args){
}