创建和运行线程
注意:我们运行Java代码时,本身就有一个线程,就是所谓的“主线程”。我们下面是在此基础上,创建其他额外的线程。
目录
一.创建线程的两种基本方式
1.方式一:new Thread实例
2.方式二:使用Runnable接口配合Thread类
二.lambda简化
1.创建Runnable接口时,可以使用lambda简化
2.也可以直接将lambda简化的Runnable接口,直接放到Thread类的构造函数中,从而创建出一个线程
三.分析创建线程时,方式一和方式二的区别
四.创建线程的方式三:FutureTask任务
五.结语
一.创建线程的两种基本方式
1.方式一:new Thread实例
@Slf4j(topic = "c.Test1")
public class Test01 {public static void main(String[] args) {//1.1 创建线程Thread t = new Thread() {@Overridepublic void run() {log.debug("running");}};//1.2 给线程命名t.setName("t1");//1.3 运行线程t.start();//2 主线程输出log.debug("running");}
}
运行结果:
2.方式二:使用Runnable接口配合Thread类
@Slf4j(topic = "c.Test2")
public class Test02 {public static void main(String[] args) {//1.1 创建Runnable接口Runnable runnable = new Runnable(){@Overridepublic void run() {log.debug("running");}};//1.2 new Thread实例Thread t = new Thread(runnable);//1.3 给线程起名t.setName("t1");//上面两步,可以写成Thread t = new Thread(runnable, "t1");//1.4 启动线程t.start();//2 主线程输出log.debug("running");}
}
运行结果:
二.lambda简化
1.创建Runnable接口时,可以使用lambda简化
如下图所示,这个lambda在外观上有点像前端的箭头函数。
2.也可以直接将lambda简化的Runnable接口,直接放到Thread类的构造函数中,从而创建出一个线程
运行结果:
以后我们就可以采用这种间接的方式,快速创建一个线程出来。
三.分析创建线程时,方式一和方式二的区别
①直接new Thread实例,是直接赋值Thread实例的run方法。
②而让Thread实例继承一个Runnable接口,再在该接口中定义run方法,是间接赋值Thread类的run方法。
总之,无论是方式一还是方式二,本质都是修改Thread实例的run方法而已,只不过一个是直接修改,一个是间接修改而已。
- 方式一是把线程和任务(run方法)合并在了一起,方式二是把线程和任务分开了。
- 使用Runnable更容易与线程池等高级API配合。
- 使用Runnable让任务类脱离了Thread继承体系,更加灵活。
四.创建线程的方式三:FutureTask任务
@Slf4j(topic = "c.Test5")
public class Test05 {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建任务FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {log.debug("running");Thread.sleep(2000);return 100;}});//创建线程,让线程执行任务Thread t1 = new Thread(task, "t1");//启动线程t1.start();//在主线程,获取任务的返回值“100”log.debug("{}", task.get());//task.get()会阻塞主线程,直到获取到任务的返回值(任务执行完毕)即可}
}
运行结果:
五.结语
以上讲了三种创建线程的方式,其实就是讲了三种定义run方法的方式,告诉线程要执行什么任务而已。
三种方式分别是在Thread中直接赋值run方法、通过Runnable接口间接赋值run方法、通过FutureTask间接定义run方法。
喜欢本篇文章的话,可以留个免费的关注呦~~