提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
程序、进程、线程的了解与学习
一、程序、进程、线程是什么?
二、进程、线程的关系是什么?
线程是进程的分身
相同点:每个线程自然在本质上是一样的,即拥有同样的程序文本。
不同点:但由于是分身,自然也应该有不一样的地方,这就是线程执行时的上下文不一致。 事实上,我们说线程是进程里面的一个执行上下文,或者执行序列。显然,一个进程可以同时拥有多个执行序列。类比进程和线程,每个演员是一个线程,舞台是地址空间,这个同一个地址空间里面的所有线程就构成了进程。在线程模式下,一个进程至少有一个线程,但也可以有多个线程。
优点:将进程分解为线程还可以有效利用多处理器和多核计算机。 在没有线程的情况下,增加一个处理器并不能让一个进程的执行速度提高。但如果分解为多个线程,则可以让不同的线程同时运转在不同的处理器上,从而提高了进程的执行速度。
线程管理:有进程后,要管理进程。那么有线程后,也要进行管理。而管理的基础也与进程管理的基础类似:就是要维持线程的各种信息,这些信息包含了线程的各种关键资料。存放这些信息的数据结构称为线程控制表或线程控制块。
线程的实现方式:
既然线程是进程的构成部分,或者是进程的分身,那么由谁来管理线程就有两种选择:一是让进程自己来管理线程;二是让操作系统来管理线程,这种不同的选择就出现了内核态线程和用户态线程。这也是线程实现的两种方式。由进程自己管理就是用户态线程实现,由操作系统管理就是内核态线程实现。
二、创建线程
1.继承Thread类的方式
代码如下定义与调用:
public class MyThread extends Thread {public void run() {}}
MyThread thread = new MyThread();thread.start();
Thread类中常用方法:
2.实现Runnable接口的方式
代码如下(示例):
public void run()
public class MyThread implements Runnable{@Overridepublic void run() {……}}线程执行任务MyThread r = new MyThread();创建一个线程作为外壳,将r包起来,Thread thread = new Thread(r);thread.start();
实现Runable的好处
三、线程优先级
● 时间片
● 抢占式:高优先级的线程抢占CPU
Thread类有如下3个静态常量来表示优先级
四、线程状态
五、守护线程
Java线程分为用户线程和守护线程。
守护线程:守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。
方法:Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。
注意:setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateException异常,该线程仍默认为用户线程,继续执行
守护线程创建的线程也是守护线程
守护线程不应该访问、写入持久化资源,如文件、数据库,因为它会在任何时间被停止,导致资源未释放、数据写入中断等问题
六、多线程的概念
多线程是指程序中包含多个执行单元,即在一个程序中可以同时运行多 个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行 执行的线程来完成各自的任务。
多线程的实现一般有两种形式:
1.通过继承Thread类实现,重新其中的run()方法,通过start方法进行调用;
2.通过实现Runnable接口,进行任务分配进行实现,在线程池中支持该实现方式。
线程的调用通过start,救赎通过sleep,stop方法因为资源占用的问题已经停止使用。
优点:
1.使用线程可以把占据时间长的程序中的任务放到后台去处理;提高cpu利用率;改善程序结构,将复杂任务分为多个线程,独立运行。;在一些等待的任务实现上,如用户输入,文件读写和网络收发数据等,线程就比较有用。在这种情况下可以释放一些珍贵的资源如内存占用等。
缺点:
七、线程同步
在Java代码中实现同步:使用synchronized(同步锁)关键字同步方法或代码块。synchronized (同步锁){// 需要被同步的代码;}synchronized还可以放在方法声明中,表示整个方法,为同步方法。例如:public synchronized void show (String name){// 需要被同步的代码;}