Thread 7.1总结
1.Concurrency 并发
在计算机科学,特别是程序设计、操作系统、多处理机和数据库等领域,并发控制(英语:Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制。这在计算机系统中也稍微有讲到,最为显著的就是计算机系统的进程调度系统。同时在日常使用PC时也能体会到并发控制这一点。
2.进程与线程
进程(Process)可以理解为一个程序,一个正在运行的程序,一般来说,一个进程都拥有自己独立的私有空间。这一点在计算机系统中也稍微有讲到过,可以参照换页机制,进程调度的相关内容。
线程:Thread,往往是指在程序内部进行调度的内容。是程序内部的控制机制。
进程的特点:1.进程拥有所有的计算机资源。 2.多线程之间无共享内存,这里也可以参照计算机系统相关内容。 3.进程之间可以通过消息相互传递,这里可以参考计算机系统中的信号相关内容。
一般来说,进程=程序,而这里提出了一个新的概念,进程间的通信,可以不局限于单个机器。这里我查找了一下,发现了下列的一个通信机制:
基于TCP/IP的Socket通信


Thread:进程=虚拟机,线程=虚拟CPU,线程可以认为是隶属于进程的,进程内部多个线程之间资源是共享的。线程之间的通信可以采用消息队列,从下面这张图可以比较明显的看除两者的关系

引入线程的概念过后,java也可以进行线程编程。首先每个应用至少有一个线程,这一点仔细观察控制台有时的输出,可以看到Thread main的字样。而主线程可以创建其他线程。想要创造一个线程,可以继承Thread类,或者实现Runable接口,除了必须要 实现run() 之后,和其他类一样, 也可具有属性和方法。而一个比较泛用的构造线程的方法如下:这种方法叫做runnable的匿名类

需要注意,启动一个线程需要用start方法,而不是run方法。 上述匿名类自然是有好有坏:好处在于明确了使用范围 , 读者不需要寻找类的定义 。坏处在于:不能复用 代码过长时,影响理解 。因此,匿名类多用于短的一次性的方法实现。
时间分片:
现成的一个基本特点是:虽然有多线程, 但只有一个核,每个时刻只能执行一个线程 。通过时间分片,在多个进程/线 程之间共享处理器。 即使是多 核CPU,进程/线程的数目也往往大于核的数目。因此时间分片仍然是有必要的。在计算机系统课程中已经了解到,决定哪个线程开始工作是由OS决定的。时间分片是由OS自动调度的
共享内存,竞争条件:
之前介绍线程的时候,有提到共享内存这一点。在java中,往往是静态关键字导致了共享内存。当使用多个变量和多个处 理器时,甚至不能指望这些变量的变化以相同的顺序出现。出于优化目的,编译器和处理器会复制变量的临时副本在高速 存储中,在存储回正式内存位置之前,基于临时副本工作 存储回内存的顺序,可能与代码中操作的变 量顺序不同。这就是所谓的竞争,看下面一个例子:

而如果在两个线程中分别执行,则会出现如下结果:

很难测试和 调试因为竞争条件导致的bug ,因为 interleaving的存在,导致很难复现bug 。
我们可以利用某些方法影响interleaving关系,线程的休眠,将某个线程休眠,意味着其他线程得到更多的执行机会 也可以向进程发出中断。中断是一种协作机制。当一个线程中断另一个 线程时,被中断的线程不一定要立即停止正在做的事情。中断是礼貌 地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。有些方法 ,例如 Thread.sleep() 、Thread.join() 和 Object.wait()等 ,很认真 地对待这样的请求(立即响应),但其他方法不是一定要对中断作出响 应,可以不予理会。 如果被中断线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、 Thread.join() 或Object.wait(),那么它将响应终端,抛出 InterruptedException异常,程序捕获该异常后,可以做中断后的处理,否则, interrupt() 只是设置线程的中断状态,通知该线程有其他线程想终止它,让它 自己决定是否终止。每个线程都有一个与之相关联的 Boolean 属性,用于表示线程 的中断状态,中断状态初始时为 false
如果不处在sleep()/其他几个特定 操作,线程无法检测到中断信号,下面对三个程序实例做出解答:

上述所述的线程是无法收到interrupt信号的,因此会打印完整

会打印下面两句话

这个则会打印tast,thread is running
可见sleep()方法会抛出InteruptException,因此当外界给到该信号时,需要捕捉该异常,并中止线程。
join方法
让当前线程保持执行,直到其执行结束
浙公网安备 33010602011771号