什么是线程?什么是进程?
线程是处理器任务调度和处理的基本单位,进程是操作系统资源分配的基本单位。
进程是程序的一次执行过程,是系统运行的基本单位,线程是比线程更小的执行单位,一个进程可以包含多个线程。
并行和并发的区别?
并行:单位时间多个处理器同时处理多个任务。
并发:一个处理器处理多个任务,按时间片进行轮转。
多线程的优缺点?
优点:如果当前要处理的线程发生阻塞或者进入等待状态,cpu可以先去执行其他的线程,节约时间。
缺点:1.死锁
2.上下文切换浪费时间。
3.资源限制。
java中守护线程和用户线程的区别?
用户线程:平时使用得到的线程都是用户线程?
守护线程:用来服务用户线程的线程。(例如垃圾回收线程)
守护线程和用户线程的区别主要在于java虚拟机后是否存活。
用户线程:当用户线程不结束,java虚拟机是不会结束的。
守护线程:如果只剩下守护线程,java虚拟机结束。
死锁是如何产生的?如何避免死锁产生?
由于两个或者两个以上的线程相互竞争对方的资源而不释放自己手中的资源,导致所有线程同时被阻塞。
1.互斥条件:一个资源在同一时刻只能由一个线程使用。
2.请求和保持条件:一个线程在请求被占资源时阻塞,同时不释放手中已有资源。
3.循环等待条件:发生死锁时,所有线程会形成一个死循环,一直阻塞。
4.不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程使用,只能自己释放。
避免死锁的产生,就是破坏死锁形成的条件。
1.破坏互斥条件:这个条件无法破坏,锁的作用就是互斥。
2.破坏请求和保持条件:一次性获得所有所需资源。
3.破坏循环等待条件:按照顺序申请资源。
4.破坏不可剥夺条件:线程在申请不到资源时,主动释放手中已有的资源。
runnable和callable有什么区别?
相同点:
1.都是接口,都需要被实现。
2.都需要用Thread.start()来启动线程。
不同点:
1.callable()的核心方法是call()允许有返回值,runnable()的核心方法是run(),没有返回值。
2.call()方法可以抛出异常,run()不能抛出异常。
线程的run()和start()有什么区别?
1.线程是通过Thread对象所对应的方法run()来完成操作的,而线程的启动是通过start()方法进行启动的。
2.run()方法可以重复调用,start()方法只能调用一次。
为什么调用start()方法会执行run()方法,而不是直接调用run()方法?
1.start()的调用表示真正开启了多线程,这时无需等待run()方法体中的程序执行完毕就可以直接执行下面的代码。通过Thread类中的start()方法来启动一个线程,此时这个线程处于就绪状态,获得cpu时间片之后就可以进入运行状态,进而执行run()方法,这里方法run()称为线程体,run()方法执行完,代表此线程执行结束。
2.run()方法只是thread类中的一个普通方法,如果直接调用run()方法,程序中依然只有主线程这一个线程,没有达到写多线程的目的。
3.调用start()是启动一个线程,run()方法只是thread类中的一个普通方法,调用run()执行的还是主线程。