并发编程三要素
1、原子性
一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行
2、可见性
多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果
3、有序性
程序的执行顺序按照代码的先后顺序来执行
线程和进程的区别
进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。
同一进程中的多个线程之间可以并发执行。
java创建线程的四种方式
1、继承Thread类
2、实现Runable接口
3、实现Callable接口
4、使用Executor框架创建
实现Runnable接口比继承Thread类的优势
1、适合多个相同的程序代码的线程去处理同一个资源
2、可以避免java单继承的限制
3、增加程序的健壮性,代码可以背多个线程共享,代码和数据独立
4、线程池只能放入Runnable或callable类相乘,不能直接放入继承Thread的类
5、runnable实现线程可以对线程进行复用,因为runnable是轻量级的对象,重复new不会耗费太大资源,而Thread则不然,它是重量级对象,而且线程执行完就完了,无法再次利用
sleep和wait区别
1、sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
2、wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备活的对象锁进入运行状态
中断线程
1、使用退出标志,是线程正常退出,也就是当run方法完成后线程终止
2、通过return退出run方法
3、通过对有些状态中断抛出异常退出,thread.interrupt()中断。(通知应用程序该中断,设置中断标志,仍然由线程自己去中断,阻塞情况下会自动中断并抛出异常)
4、使用stop方法强行终止线程(过期)