并行是不同实体两个或两个以上的线程在同一时刻发生;并发是同一实体上两个或两个以上线程在同一时间间隔发生。
进程是程序执行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程;线程是进程的一个实体,线程是cpu执行和分配的基本单位,线程是程序还小的可独立运行的基本单位,在同一个进程中多个线程可以并发执行。
守护线程就是服务线程,说白了就是服务其他线程的。
继承thread类,重写重写run方法,然后用实现类的对象调用start方法启动线程;实现runable接口,重写run方法,然后将实现类的对象当做thread类的target来创建线程对象,线程对象调用start方法启动线程。实现collable接口,重写call方法,用futuretask对象来包装实现类对象,将包装后的对象当做thread类的target对象创建线程对象,在用新创建的线程对象调用start方法来启动线程,其中线程的返回值可以用未来对象的get方法获取。
runnable创建线程的方式是:实现runnable接口,重写run方法,将此实现类的对象当做thread类的target对象以此来创建出线程对象,在通过线程对象的start方法启动线程。callable创建线程的方式是:实现callable接口,用futuretast来包装实现类对象,将包装后的对象当做thread类的target来创建线程对象,在用线程对象调用start方法启动线程,其中可以用未来对象调用它的get方法获取线程的返回值。
创建、就绪、运行、阻塞、死亡。
创建:就是你在创建线程对象,但是还没有调用start时的状态。
就绪:线程对象调用了start方法,但是线程调度没有将该线程设为当前线程,就进入就绪状态。
运行:就绪状态的线程得到资源调度设成了当前线程,进入运行状态,执行线程体中的内容。
阻塞:运行状态由于等待某种资源的而进入的一种等待状态,解除这种状态后进入就绪状态。
死亡:就是线程执行完成了,则进入死亡状态。
sleep()是让线程进入睡眠状态,睡眠状态解除后,线程会进入到就绪状态,其中在睡眠状态的时候,线程中的对象不会释放锁,直到将锁中内容运行完后才会释放锁;wait()是让线程进入等待状态,首先线程是进入该对象的等待池中,如果被notify唤醒后进入锁池中竞争锁,得到锁后进入就绪状态等待线程调度。
notify是唤醒对象池中的某个对象,而notifyAll是唤醒对象池中的所有对象进入锁池竞争锁。
start()是用来启动一个线程的,而run()是线程的执行体,里面有线程要执行的内容,但是执行里面内容没执行完还可以执行其他的线程。
固定长度的线程池、有缓存的线程池、单线程的线程池、有定时的线程池。
new fixedthreadpool:线程数量固定。
new cachedthreadpool:线程池里的线程数量可以改变,并且会根据情况清楚无用线程。
new threadpoolexecuater:这是一个单线程,会按照任务队列中顺序依次执行任务,如果出现以外会创建一个新的线程继续执行任务。
new scheduledthreadpool:可以执行定时任务的线程池。
running、shoutdown、stop、tyding、terminated。
running:线程池的初始状态,可以正常接收和执行任务。
shoutdown:改状态下不可接收任务,但是可以执行线程池中已有的任务。
shoutdownnow:该状态下不可接收任务,不可执行任务。
tyding:当执行了shoutdown()线程池中的任务为0时进入该状态,此时会执行钩子函数terminated()。
terminated:钩子函数执行完后进入该状态,代表线程池已结束。
都是提交一个线程给线程池,但是submit有返回值。
原子性:一个数据同一时刻只能有一个线程访问。
可见性:一个线程对内存结构的改变另一个线程也可看到
顺序性:跟线程的执行顺序有关,问你的话就不太懂这个就行。
无锁==》偏向锁==》轻量级锁===》重量级锁
多个进程之间互相请求资源或者彼此通信造成的一种阻塞状态,称为死锁。
从死锁产生的四个条件入手:互斥条件、请求和保持条件、不可剥夺条件、环路等待条件。
互斥条件:一个进程所持有的资源,另一个进程不可访问。
请求和保持条件:一个进程请求另一个进程的资源时由于互斥条件的存在,改进程只能等待另一个进程释放资源,但是等待过程中不会释放自己所持有的资源。
不可剥夺条件:一个进程一旦持有某个资源就不能被剥夺,除非他自己释放该资源。
环路等待条件:在死锁的状态下多个进程等待彼此的资源而形成的一种环路现象。
预防死锁可以从这四个方面在设计操作系统的时候预防。
threadlocal是线程的局部变量,只在当前线程有效,资源不共享。是一种实现线程安全的方式。尽量不要用在web应用中,否则会造成内存泄漏。
synchronized在代码块和方法运行时,保证同一时间只有一个方法进入临界区,同时还保证了共享变量的内存可见性。
不用记,问到了就说不会。
synchronized 自动释放锁,lock需要自己在trycatch finally的finally中用unlock方法手动释放锁;synchronized 是java的关键字,lock是java的类;lock可以获取锁的信息,synchronized 无法获得;synchronized 获取不到锁会持续等待,lock持续获取不到锁会结束线程。
不用背,问了就说不会。
ronized 获取不到锁会持续等待,lock持续获取不到锁会结束线程。
不用背,问了就说不会。
不用背,问了就说不会。
补:1、synchronized的几种使用方法
同步代码块:synchronized(this),让当前对象作为锁,也就是同一时间只有一个线程可访问
同步方法:在方法上加synchronized修饰,让当前方法所对应的实例作为锁,如果多个线程都有实例,谁先获得的实例谁就拥有锁
同步静态方法或者类:同样是把静态方法或类用synchronized修饰,每个线程都有可能获得一个类实例,但是谁先获得类实例谁就拥有锁,谁就可以先访问。