线程和进程的区别
进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成了一个进程,进程是处于运行过程中的程序,并且具有一定独立功能.
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序,简而言之,一个程序运行后至少有一个进程,一个进程中可以包含多个线程.
用户线程和守护线程有什么区别
所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可缺的部分,因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止.
用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了,因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了.
操作共享数据的安全性
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码,程序每次运行结果和单线程运行的结果是一样的.而且其他的变量的值也和预期的是一样的,就是线程安全的.
其实,线程安全问题都是由全局变量以及静态变量引起的.若每个线程中对全局变量,静态变量只有读操作,而无写操作,一般来说这个全局变量是线程安全的,若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全.
如何暂停一条线程
两种方式暂停一条线程,一个是 采取Thread类的sleep方法,一个是在同步代码中使用wait方法.
线程的调度和时间分片
java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高 的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU.出去运行状态的线程会一直运行,直至它不得不放弃CPU.
线程的调度不是跨平台的,它不仅仅取决于java虚拟机,还依赖于操作系统。在某些操作系统中,只要运行中的线程没有遇到阻塞,就不会放弃CPU;在某些操作系统中,即使线程没有遇到阻塞,也会运行一段时间后放弃CPU,给其它线程运行的机会。
java的线程调度是不分时的,同时启动多个线程后,不能保证各个线程轮流获得均等的CPU时间片。
线程之间如何进行通信
多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。通过一定的手段使各个线程能有效的利用资源。
通常情况下,一个次级线程要为主线程完成某种特定类型的任务,这就隐含着表示在主线程和次级线程之间需要建立一个通信的通道。一般情况下,有下面的几种方法实现这种通信任务:使用全局变量、使用事件对象、使用消息。
ThreadLocal类
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的.
通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。
Sleep wait 之间有什么区别
sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法,调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。
什么是死锁
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等待其它资源锁的释放,除非一个用户进程被终止.