线程的创建及状态
1.线程的生命周期
2.创建一个线程
import java.util.concurrent.TimeUnit;
public class ThreadStateTest {
public static void main(String[] args) throws InterruptedException {
// 创建一个线程对象
Thread thread = new Thread();
System.out.println("1- " + thread.getState());
// 启动线程
thread.start();
System.out.println("2- " + thread.getState());
// 主线程睡眠等待线程执行结束
TimeUnit.SECONDS.sleep(1);
System.out.println("3- " + thread.getState());
}
}
3.创建有任务线程
创建有任务线程有以下三种方式:
- 重写Thread的run()方法
- 实现Runnable接口,在创建Thread对象时传入
- 使用FutureTask,在创建Thread对象的时候传入
重写run()方法
public class CreateThreadRun {
public static void main(String[] args) {
Thread thread = new Thread(){
// 重写run方法
@Override
public void run(){
System.out.println("一个子线程任务");
}
};
thread.start();
System.out.println("main结束");
}
}
Runnable实现
Runnable是一个函数式接口,可以作为Thread构造函数的参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-POsQRu60-1651665613459)(https://cdn.jsdelivr.net/gh/Autovy/Image/img/202202260915940.png)]
public class CreateThreadRunnable {
public static void main(String[] args) {
Thread thread = new Thread(
// lambda表达式可以为函数式接口创建匿名对象(类型是Runnable)
() -> System.out.println("一个子线程任务")
);
thread.start();
System.out.println("main结束");
}
}
FutureTask实现
上面两者方式中,子线程没有返回值也没有抛出异常(这是由其中的run方法决定的),所以主线程对子线程的状况一无所知,而接下来的FutureTask可以解决这两个问题
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CreateThreadFutureTask {
public static void main(String[] args) {
// 实现Callable接口,写入任务,放入FutureTask中
Callable<String> callable = () ->{
System.out.println("一个子线程任务");
return "sub task done";
};
// 构造FutureTask类(其实质是Runnable的一个实现)
FutureTask<String> task = new FutureTask<>(callable);
Thread thread = new Thread(task);
thread.start();
System.out.println("子线程启动");
// 主线程获得子线程返回值并捕捉异常
try{
// get()获得子线程返回值
String subResult = task.get();
System.out.println("子线程返回值:" + subResult);
}
catch (InterruptedException e){