多线程编程核心技术读书笔记(一):Java多线程技能

来源:互联网 发布:淘宝查排名 编辑:程序博客网 时间:2024/06/05 06:53

什么是进程:能够让操作系统从宏观上看起来同一个时间段有多个任务在执行。进程让操作系统的并发成为了可能。
什么是线程:进程中独立运行的子任务。进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。
一个进程虽然包括多个线程,但是这些线程是共同享有进程占有的资源和地址空间的。进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位。

对于单核CPU,如果是CPU密集型任务,如解压文件,多线程的性能反而不如单线程性能,因为解压文件需要一直占用CPU资源,如果采用多线程,线程切换导致的开销反而会让性能下降。但是对于比如交互类型的任务,肯定是需要使用多线程的;
而对于多核CPU,对于解压文件来说,多线程肯定优于单线程,因为多个线程能够更加充分利用每个核的资源。
虽然多线程能够提升程序性能,但是相对于单线程来说,它的编程要复杂地多,要考虑线程安全问题。因此,在实际编程过程中,要根据实际情况具体选择。
在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认为java.exe或者javaw.exe(windows下可以通过任务管理器查看)。Java采用的是单线程编程模型,即在我们自己的程序中如果没有主动创建线程的话,只会创建一个线程,通常称为主线程。但是要注意,虽然只有一个线程来执行任务,不代表JVM中只有一个线程,JVM实例在创建的时候,同时会创建很多其他的线程

在java中如果要创建线程的话,一般有两种方式:1)继承Thread类;2)实现Runnable接口。
多线程是随机的调用;

实例变量与线程安全:

多个线程共享对象时有可能出现运行错误;

Thread.currentThread()返回正在被哪个线程调用的信息;~.getName();
myThread.isAlive();返回当前线程是否处于活动状态;true、false;
myThread.sleep();使当前线程休眠,让出CPU,但是不让出锁;
myThread.getId();返回线程唯一标识;

线程的停止:

1、使用退出标志,正常退出,run方法完成后;
2、stop强制退出,unsafe;
3、interrupt:中断停止
但是此方法并不会真正的停止线程的执行,只是在线程中添加了一个停止的标记,需要加入一个判断才能让线程停止。
interrupt,顾名思义,即中断的意思。单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,也就说,它可以用来中断一个正处于阻塞状态的线程;另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。
interrupted()方法测试当前线程是否已经中断,如果调用该方法时线程已经中断,则此方法返回true,并且此方法会解除中断状态。所以当第二次调用该方法时会返回false;
isInterrupted()方法测试线程是否中断但是不清除中断状态。

可用异常停止线程;
如果在sleep的过程中,调用interrupt();则进入catch语句,停止;
如果先调用interrupt();则遇到sleep时,进入catch语句,停止;
stop()马上停止;(已经作废,可能对数据造成不一致的结果)
interrupt()和return结合停止线程;return在isInterrupt()处理后;

线程的暂停:
suspend(暂停)方法+resume(继续,重新开始)方法
缺点:
1、独占:此方法可能导致线程挂起并永久的持有公共对象,导致其他线程无法获得对象进行执行。
2、不同步:容易造成数据不同步。

yield()方法作用是放弃当前线程的CPU资源。让给其他线程执行,但是放弃的时间不确定有可能刚放弃,马上又获得CPU时间片。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
方法join的作用是使所属的线程对象x正常执行run()方法中任务,而使得当前线程z进行无限期的阻塞,直到x线程结束并销毁才继续执行z;
t.join(); //使调用线程 t 在此之前执行完毕。
t.join(1000); //等待 t 线程,等待时间是1000毫秒
join方法实现是通过wait;wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。

java中线程的优先级有十级,1到10,数字越大优先级越高,可以通过setPriority()进行设置,优先级越高的线程有更多的机会获得cpu进行执行。
优先级具有继承特性,a线程启动b线程,则b的优先级与a相同;
优先级越高的线程有更多的机会获得cpu进行执行,但是结果不确定;所以不能把线程优先级作为执行顺序的衡量标准。

守护线程:eg:垃圾回收线程一直在,用户线程没了,守护线程就自动销毁;
这里写图片描述
这个图很关键!!!

阅读全文
0 0
原创粉丝点击