多线程面试常问

一、创建线程的几种方式

1、继承Thread类并重写run()方法。

public class MyThread extends Thread {
	@Override
	public void run() {

		System.out.println("通过集成 Thread 类实现线程");
}
}
// 如何使用
new MyThread().start()

2、实现Runnable接口并重写run()方法。将Runnable实例作为Thread类的构造函数参数传递并启动线程。

public class MyRunnable implements Runnable {
@Override
public void run() {

System.out.println("通过实现 Runnable 方式实现线程");
}
}
// 使用
// 1、创建MyRunnable实例
MyRunnable runnable = new MyRunnable();
//2.创建Thread对象
//3.将MyRunnable放入Thread实例中
Thread thread = new Thread(runnable);
//4.通过线程对象操作线程(运行、停止)
thread.start();


3、实现Callable接口并重写call()方法。使用ExecutorService的submit()方法提交Callable任务,并通过Future对象获取返回值。

public class MyCallable implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
	
			return new Random().nextInt();

}
// 使用方法
// 1、创建线程池
ExecutorService service = Executors.newFixedThreadPool(10);
// 2、提交任务,并用 Future提交返回结果
Future<Integer> future = service.submit(new MyCallable());
}

4.使用线程池。线程池可以重复使用线程,提高性能和可靠性。Java提供了Executor框架来管理线程池。常见的线程池实现类包括ThreadPoolExecutor和ScheduledThreadPoolExecutor

public class ThreadPool {
   public static void main(String[] args) {

		//1. 提供指定线程数量的线程池
		
		ExecutorService service = Executors.newFixedThreadPool(1);
		
		//输出class java.util.concurrent.ThreadPoolExecutor
		
		System.out.println(service.getClass());

		ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;
		
		//自定义线程池的属性
		
		//        service1.setCorePoolSize(15);
		//        service1.setKeepAliveTime();
		//2. 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象
		service.execute(new NumberThread());//适用于Runnable
		service.execute(new NumberThread1());//适用于Runnable
		//        service.submit(Callable callable);//适合使用于Callable
		//3. 关闭连接池
		service.shutdown();
		}
		}

 

二、线程的几种状态

 

 

二、如何保证线程执行顺序

使用join,可以等待线程执行完成

三、notify和notifyAll的区别

notify只是随机唤醒一个线程

notifyAll是唤醒所有的线程

四、java中wait和sleep方法的不同

五、锁升级过程

 六、Volatile关键字的理解

七、synchronized和Lock锁区别

 

八、ReentranLock锁

 

线程池 

1、线程池有哪些核心参数

最大线程数:=核心线程数+救急线程数

核心线程数

阻塞队列:WorkQueue,当没有空闲核心线程数时,新来的任务就会加入到此队列,队列满就会创建救急线程执行任务

救急线程得存活时间:keepAliveTime 生存时间内没有新任务就会资源释放

时间单位:unit救急线程的存活时间单位

线程工厂:threadFactory-可以定制线程对象的创建,例如设置线程名称,是否守护线程等

拒绝策略:当所有的线程都在工作,阻塞队列也满了,就会触发拒绝策略

 

2、常见的阻塞队列

 

3、如何确定核心线程数 

4、线程池的种类

5、谈谈ThreadLocal的理解 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学会用脚编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值