java种线程池是否要单例_月薪3k的后端面试题-Java线程与并发

串行

初期的计算机智能串行执行任务,并且需要长时间等待用户输入

批处理

预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行

进程

进程独占内存空间,保存各自运行状态,相互间不干扰且可以互相切换,为并发处理任务提供了可能

线程

共享进程的内存资源,相互间切换更快速,支持更细粒度的任务控制,使进程内的子任务得以并发执行

进程是资源分配的最小单位,线程是CPU调度的最小单位

所有与进程相关的资源,都被记录在PCB中

进程是抢占处理机的调度单位;线程属于某个进程,共享其资源

线程只由堆栈寄存器、程序计数器和TCB组成

线程不能看做独立应用,而进程可看做独立应用

进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径

线程没有独立的地址空间,多进程的程序比多线程程序健壮

进程的切换比线程的切换开销大

Java对操作系统提供的功能进行封装,包括进程和线程

运行一个程序会产生一个进程,进程包含至少一个线程

每个进程对应一个JVM实例,多个线程共享JVM里的堆

Java采用单线程编程模型,程序会自动创建主线程

主线程可以创建子线程,原则上要后于子线程完成执行

Thread中的start和run方法的区别

调用start()t方法会创建一个新的子线程并启动

run()方法只是Thread的一个普通方法的调用

Thread和Runnable是什么关系

Thread是实现了Runnable接口的类,使得run支持多线程

因类的单一继承原则,推荐多使用Runnable接口

如何给run()方法传参

构造函数传参

成员变量传参

回调函数传参

如何实现处理线程的返回值

主线程等待法 需要自己实现代码

使用Thread类join()阻塞当前线程以等待子线程处理完毕 不灵活

通过Callable接口实现:通过Future Task Or 线程池获取

public class FutureTaskDemo{

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

FutureTasktask=new FutureTask(new MyCallable());

new Thread(task).start();

if(!task.isDone()){

System.out.printin("task has not finished,please wait!");

}

System.out.printin("task return:"+task.get());

}

}

public class ThreadPoolDemo{

public static void main(String[] args){

ExecutorService newCachedThreadPool=Executors.newCachedThreadPool();

Future future=newCachedThreadPool.submit(new MyCallable());

if(!future.isDone()){

System.out.printin("task has not finished,please wait!");

}

try{

System.out.printin(future.get());

}catch(InterruptedException e){

e.printStackTrace();

}catch(ExecutionException e){

e.printStackTrace();

}finally{

newCachedThreadPool.shutdown();

}

线程六状态

新建(New):创建后尚未启动的线程的状态

运行(Runnable):包含Running和Ready

无限期等待(Waiting):不会被分配CPU执行时间,需要显式被唤醒

没有设置Timeout参数的**Object.wait()**方法。

没有设置Timeout参数的**Thread.join()**方法。

**LockSupport.park()**方法。

限期等待(Timed Waiting):在一定时间后会由系统自动唤醒

Thread.sleep()方法。

设置了Timeout参数的Object.wait0方法。

设置了Timeout参数的Thread.join0方法。

**LockSupport.parkNanos()**方法。

**LockSupport.parkUntil()**方法。

阻塞(Blocked):等待获取排它锁

结束(Terminated):已终止线程的状态,线程已经结束执行

sleep和wait的区别

sleep是

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值