1.实现线程的方式
thread类;runable callable接口;
Q:callable 怎么实现的(和runnable不同的是返回处理结果)
使用时,三者的区别
目前看使用接口优于使用类;
thread runnable都能实现数据共享,有好不好的区别
new Thread(new MyThread()).start() ------这种线程自己有自己的start方法,还用另外线程的start方法就很奇怪。
new Thread(runnalble).start()
Q:数据共享怎么达到的(三种方式)
2.为什么用start不用run
start()源码中逻辑包含run()方法,即有线程的执行逻辑,也包含了线程执行前的准备工作:修改字段staus 的值,从new到准备状态;包含start0()方法,调用系统分配资源。
线程的执行过程:
创建一个线程=》调用线程的start()方法=》线程进入到准备就绪状态,等待调度=》得到分配的资源,执行=》执行一会,让出资源=》自己进入了准备就绪状态,等待资源=》循环=》执行完整个run()方法,最后终止。
Q:进程 线程的关系
进程是 每当使用java 命令去解释的时候,都表示启动了一个jvm进程。而主方法只是进程上的一个线程而已。
线程休眠方法sleep()
Q线程优先级别
Q等待 唤醒机制
Q线程池 juc中的两接口一类:
一个普通线程池;一个调度线程池,定时完成;Excutor类,创建新线程池,固定大小或者无限制大小,或者一个线程的线程池(3种常用创建线程的方式)
Qcallable 要启动线程(只有Thread类的start方法,唯一)callable怎么联系到线程上面去?
futureTask类 =》继承runnablefuture接口 和future接口=》future接口的实现callable接口,get方法有返回值.
Q callable 和runnable的区别
runnable:先出现(jdk.1.0);在java.lang
callable:后出现(jdk.1.5)
Q 线程的常用方法 中断(interrupt;isinterrupt);强制执行(先执行某个操作)
--------------续
(Thread类中join方法);礼让线程()
- 1.线程礼让方法(thread类重yield方法)
- 优雅的停止线程。stop方法(jdk.1.2. 就开始不推荐使用)destory。用thread 的sleep
- 后台守护线程。thread类当中的isdaemon setDaemon.守护线程进阶需要去了解
- volatile 用于属性定义上(直接操作的变量数据,与通常变量放到副本再操作的不同)。
- volatile和sychonized的区别。一个用于属性,一个代码块和方法;volatile无法描述同步,直接内存处理,避免副本的操作,而sychonized是去实现同步的。
------------------并发多线程知识点总结(详细)
并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全?
2.1 并发编程三要素(线程的安全性问题体现在)
原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)
有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)
2.2 出现线程安全问题的原因
线程切换带来的原子性问题
缓存导致的可见性问题
编译优化带来的有序性问题
2.3 解决办法
JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题