Lang:简体中文

JAVA线程面试问题

日期:2025-09-08 / 来源:面试宝典

深入解析java线程面试疑难点

在java面试中,线程相关问题是常考的重点内容。下面就为大家详细介绍一些常见的java线程面试问题。

线程的创建方式

java中创建线程主要有三种方式。第一种是继承thread类,重写run方法。示例代码如下:

class mythread extends thread { public void run() { system.out.println("继承thread类创建的线程在执行"); }}

使用时,通过创建mythread的实例并调用start方法启动线程。第二种是实现runnable接口,实现run方法。示例如下:

class myrunnable implements runnable { public void run() { system.out.println("实现runnable接口创建的线程在执行"); }}

使用时,将myrunnable实例作为参数传递给thread类的构造函数,再调用start方法。第三种是实现callable接口,重写call方法,这种方式可以有返回值。示例代码如下:

import java.util.concurrent.callable;import java.util.concurrent.futuretask;class mycallable implements callable { public integer call() { return 100; }}

使用时,需要创建futuretask对象,将mycallable实例传入,再将futuretask对象作为参数传递给thread类的构造函数并启动线程。

线程的生命周期

java线程的生命周期包括新建、就绪、运行、阻塞和死亡五种状态。新建状态是指线程对象被创建但还未调用start方法。当调用start方法后,线程进入就绪状态,等待cpu调度。一旦cpu分配时间片给该线程,线程就进入运行状态。如果线程在运行过程中遇到某些情况,如等待i/o操作、调用sleep方法等,就会进入阻塞状态。当阻塞条件解除后,线程又会回到就绪状态。当线程的run方法执行完毕或者出现异常,线程就进入死亡状态。

线程同步的方法

为了保证线程安全,需要进行线程同步。常见的方法有使用synchronized关键字和lock接口。synchronized关键字可以修饰方法和代码块。示例如下:

class synchronizedexample { public synchronized void method() { // 同步方法 } public void blockmethod() { synchronized (this) { // 同步代码块 } }}

lock接口提供了更灵活的锁机制,示例如下:

import java.util.concurrent.locks.lock;import java.util.concurrent.locks.reentrantlock;class lockexample { private lock lock = new reentrantlock(); public void method() { lock.lock(); try { // 临界区代码 } finally { lock.unlock(); } }}

线程池的使用

线程池可以提高线程的使用效率,避免频繁创建和销毁线程带来的开销。java提供了executor框架来创建和管理线程池。常见的线程池有fixedthreadpool、cachedthreadpool、scheduledthreadpool等。示例代码如下:

import java.util.concurrent.executorservice;import java.util.concurrent.executors;public class threadpoolexample { public static void main(string[] args) { executorservice executor = executors.newfixedthreadpool(5); for (int i = 0; i < 10; i++) { executor.execute(new myrunnable()); } executor.shutdown(); }}

线程间的通信

线程间通信可以使用wait、notify和notifyall方法。这些方法是object类的方法,必须在同步代码块或同步方法中使用。示例如下:

class communicationexample { public static void main(string[] args) { final object lock = new object(); thread t1 = new thread(() -> { synchronized (lock) { try { system.out.println("线程1等待"); lock.wait(); system.out.println("线程1继续执行"); } catch (interruptedexception e) { e.printstacktrace(); } } }); thread t2 = new thread(() -> { synchronized (lock) { system.out.println("线程2通知"); lock.notify(); } }); t1.start(); t2.start(); }}

以上就是一些常见的java线程面试问题,希望对大家有所帮助。

以下为推荐内容

微信二维码