专业的JAVA编程教程与资源

网站首页 > java教程 正文

多线程常见面试题(多线程笔试题)

temp10 2024-09-30 00:13:33 java教程 14 ℃ 0 评论

线程和进程的区别是什么?

  • 什么是进程?

进程是并发执行的程序在执行过程中分配和管理资源的基本单位。

  • 什么是线程?

线程是进程的一个执行单元,是比进程还要小的独立运行的基本单位。

多线程常见面试题(多线程笔试题)

  • 进程和线程的关系

一个运行的程序中至少有一个进程,一个进程中至少会有一个线程。

在java中如何实现多线程?

  • 继承Thread类,重写run方法


package com.thread;

/**

* @descrption 使用集成Thread类来实现多线程

* @author lizhilun

*

*/

public class ThreadDemo extends Thread{

//重写run方法

@Override

public void run() {

System.out.println("Thread子类实现的多线程。。。。");

}

//测试线程启动

public static void main(String[] args) {

ThreadDemo thread = new ThreadDemo();

thread.start();//启动线程

}

}

  • 实现Runnable接口,重写run方法(无返回值)


package com.thread;

/**

* @descrption 实现Runnable接口创建多线程

* @author lizhilun

*

*/

public class RunnableDemo implements Runnable{


//重写run方法

@Override

public void run() {

System.out.println("实现Runnable接口来创建的多线程。。。。");

}

// 测试线程启动

public static void main(String[] args) {

RunnableDemo runnable = new RunnableDemo();

Thread thread = new Thread(runnable);

thread.start();// 启动线程

}

}

  • 实现Callable接口,重写call方法(有返回值)


package com.thread;

/**

* @descrption 实现Callable接口创建多线程

* @author lizhilun

*

*/

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

@SuppressWarnings("all")

public class CallableDemo implements Callable{


//重写call方法

@Override

public Object call() throws Exception {

String result="实现Callable接口来创建的多线程。。。。";

return result;

}

// 测试线程启动

public static void main(String[] args) throws InterruptedException, ExecutionException {

CallableDemo runnable = new CallableDemo();

FutureTask futureTask = new FutureTask<>(new CallableDemo()) ;

Thread thread = new Thread(futureTask);

thread.start();// 启动线程

Object result = futureTask.get();//获取call方法的返回值

System.out.println(result);

}

}

启动一个线程是run()还是start()?它们的区别是什么?

start()启动线程;

run():是在start()方法会自动调用run()方法,线程中要做的事情要写到run中

为什么wait(),notify(),notifyAll()等方法都定义在Object类中?

任何的类都可能被多个线程并发访问,所以,任何类都有权利要求所访问的线程"等待",也有唤醒等待线程的能力,所以这些方法定义在Object类中

sleep()和wait()方法的区别?

sleep()方法用被用于让程序暂停指定的时间,而wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者nofifyAl()方法

如何保证线程的安全?

需要使用同步来实现线程的安全,同步的实现的三种方式:

  • 同步方法

在方法上加synchronized关键字来修饰

  • 同步代码块

使用synchronized来修饰需要同步的代码块

  • 使用Lock锁

在需要同步的代码之前Lock的lock()方法获取锁并在finally中调用Lock的unlock()方法来释放锁

线程的运行状态和常见执行情况图解



本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表