Java并发编程-线程基础
文章插图
1. 线程的创建首先我们来复习我们学习 java 时接触的线程创建 , 这也是面试的时候喜欢问的 , 有人说两种也有人说三种四种等等 , 其实我们不能去死记硬背 , 而应该深入理解其中的原理 , 当我们理解后就会发现所谓的创建线程实质都是一样的 , 在我们面试的过程中如果我们能从本质出发回答这样的问题 , 那么相信一定是个加分项!好了我们不多说了 , 开始今天的 code 之路
1.1 继承 Thread 类创建线程 **
- 这是我们最常见的创建线程的方式 , 通过继承 Thread 类来重写 run 方法 ,
/** * 线程类 * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */public class ThreadDemo extends Thread {@Overridepublic void run() {//线程执行内容while (true){try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ThredDemo 线程正在执行,线程名:"+ Thread.currentThread().getName());}}}
测试方法:@Testpublic void thread01(){Thread thread = new ThreadDemo();thread.setName("线程-1 ");thread.start();while (true){System.out.println("这是main主线程:" + Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}
结果:文章插图
继承 Thread 的线程创建简单 , 启动时直接调用 start 方法 , 而不是直接调用 run 方法 。 直接调用 run 等于调用普通方法 , 并不是启动线程
1.2 实现 Runnable 接口创建线程
- 上述方式我们是通过继承来实现的 , 那么在 java 中提供了 Runnable 接口 , 我们可以直接实现该接口 , 实现其中的 run 方法 , 这种方式可扩展性更高
/** * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */public class RunnableDemo implements Runnable {@Overridepublic void run() {//线程执行内容while (true){try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("RunnableDemo 线程正在执行,线程名:"+ Thread.currentThread().getName());}}}
测试代码:@Testpublic void runnableTest(){// 本质还是 Thread, 这里直接 new Thread 类 , 传入 Runnable 实现类Thread thread = new Thread(new RunnableDemo(),"runnable子线程 - 1");//启动线程thread.start();while (true){System.out.println("这是main主线程:" + Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}
运行结果:文章插图
1.3 实现 Callable 接口创建线程
- 这种方式是通过 实现 Callable 接口 , 实现其中的 call 方法来实现线程 , 但是这种线程创建的方式是依赖于 ** `FutureTask `包装器**来创建 Thread , 具体来看代码
/** * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */public class CallableDemo implements Callable {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/@Overridepublic String call() throws Exception {//线程执行内容try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("CallableDemo 线程正在执行,线程名:"+ Thread.currentThread().getName());return "CallableDemo 执行结束 。。。。 ";}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 计算机专业大一下学期,该选择学习Java还是Python
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 机器人|万州区举办“中国梦科技梦”机器人编程大赛
- 学习大数据是否需要学习JavaEE
- 从事Java开发时发现基础差,是否应该选择辞职自学一段时间
- 2021年Java和Python的应用趋势会有什么变化?
- 普通大学计算机专业的本科生,该选择主攻前端还是Java
- 英特尔推出可检测代码错误的ControlFlag机器编程工具
- 可编程3D打印耗材可帮助普通3D打印机轻松实现多材料物品的制作
- Java语言会不会随着容器的兴起而衰落