[面试]java创建线程有几种方式?

本文详细介绍了在Java中创建线程的三种主要方法:继承Thread类、实现Runnable接口及使用Callable接口配合FutureTask。每种方法都有其适用场景与优劣点,适合初学者快速上手并为进阶打下基础。
摘要由CSDN通过智能技术生成

一、继承Thread类创建线程子类

1.在这子类中重写run方法,在run方法内写线程任务代码

2.创建该子类实例,即是创建了一个线程实例

3.调用该实例的start方法来启动该线程

二、建一个类去实现Runnable接口

1.该类去实现接口的run方法,run方法内写线程任务代码

2.创建该类实例,把该实例当作一个标记target传给Thread类,如:Thread t = new Thread(该类实例);即创建一个线程对象

3.调用线程的start方法来启用该线程.


三、通过Callable 接口和 RunnableFuture创建线程

                Callable<Integer> cl = new Callable<Integer>(){
			public Integer call() throws Exception {
				//业务逻辑...
				return null;
			}
		};
		
		FutureTask<Integer> ft =  new FutureTask<Integer>(cl); //实现了RunnableFuture 接口

		
		Thread t = new Thread(ft);
		t.start();


优劣:

二、三两种方式是实现某接口,可以去继承其他类,操作相对灵活,并且能多个纯种共享一个对象Thread t = new Thread(ft);里面的ft对象能多个线程共享,劣势是编程相对复杂

一种方式是继承Thread类,不能再继承其他类,编程相对简单

### Java线程创建的方法 在 Java 中,可以通过多种方式创建线程。以下是两种主要的线程创建方法: #### 1. 继承 `Thread` 类 通过继承 `Thread` 类并重写其 `run()` 方法可以创建一个新的线程。这种方式适合于较为简单的场景[^2]。 ```java class MyThread extends Thread { @Override public void run() { System.out.println("线程运行中..."); } } public class ThreadExample { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); // 启动新线程 } } ``` 这种方法的优点在于其实现简单明了,但对于复杂的任务可能不够灵活。 --- #### 2. 实现 `Runnable` 接口 另一种常见的线程创建方式是实现 `Runnable` 接口,并将其实例传递给 `Thread` 的构造函数。这种方式更加推荐,因为它不会占用额外的继承机会[^3]。 ```java public class MyRunnable implements Runnable { public void run() { System.out.println("Runnable running"); } public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); // 启动线程 } } ``` 相比继承 `Thread` 类,这种实现更具有灵活性,尤其是在需要多个类共享同一组资源的情况下更为适用。 --- ### 面试常见问题 关于 Java线程技术,在面试过程中可能会涉及以下几个方面的问题: #### 1. **CAS 是什么?** CAS(Compare And Swap),即比较并交换操作,是一种无锁算法的核心机制。它用于原子级别的更新变量值的操作。如果当前内存中的值等于预期旧值,则将其替换为新值;否则不做任何修改[^4]。 #### 2. **如何判断 CyclicBarrier 是否被打破?** CyclicBarrier 提供了一个名为 `isBroken()` 的方法,该方法能够检测是否有线程提前退出或者发生了异常而导致屏障失效。如果是这种情况,那么调用此方法会返回 `true`。 #### 3. **为什么优先使用 `Runnable` 而不是直接扩展 `Thread`?** 因为 Java 不支持多重继承,所以当一个类已经继承自另一个父类时就不能再继承 `Thread` 来构建新的线程对象。而采用 `Runnable` 则完全规避了这个问题,使得设计上更具弹性。 #### 4. **同步代码块与 synchronized 关键字的区别是什么?** `synchronized` 可作用于整个方法或仅限部分代码区域(称为同步代码块)。前者锁定的是实例本身或者是静态方法所属的 Class 对象;后者则允许开发者指定具体的监视器对象来进行加锁控制[^1]。 #### 5. **死锁是如何产生的以及怎样预防?** 死锁通常发生在两个及以上进程互相等待对方释放它们所持有的资源的时候发生僵局状态无法继续执行下去的现象。防止策略包括但不限于减少不必要的锁竞争、按照固定顺序获取锁等措施。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值