Java多线程
多线程技术概述
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但是多线程使用了更小的资源开销。
线程与进程
进程
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,包含一个或多个线程。一个线程不能独立存在,它必须是进程的一部分。一个进程一直运行,直到所有的非 守护线程都执行结束运行后才能结束。
线程
是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行。 一个进程最少 有一个线程 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分 成若干个线程。
线程的生命周期
线程是一个动态的执行过程,也有一个从生产到死亡的过程。
新建状态:使用new关键字和Thread类或子类建立一个线程对象后。
就绪状态:现场对象调用start()方法。
运行状态:线程获取CPU资源,执行run()方法。
阻塞状态:线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用的资源。
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时。
线程优先级
每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。
具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。
创建一个线程
Java提供了三种创建线程的方法:
实现Runnable接口;
继承Thread类;
通过Callable和Future创建线程。
线程常用方法
start() 线程开始执行
setName() 更改线程名称
getName() 获取线程名称
setPriority() 更改线程优先级
serDaemon() 表记为守护线程或用户线程
isAlive() 测试线程是否处于活跃状态
sleep() 在指定毫秒数内让线程休眠
currentThread() 获取当前正在执行的线程
线程池 Executors
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程 就会大大降低 系统的效率,因为频繁创建线程和销毁线程需要时间. 线程池就是一个容纳多个线程的容 器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
线程池的好处: 降低资源消耗。 提高响应速度。 提高线程的可管理性。
并发和并行的区别
并行和并发区别. 并发是指一个处理器同时处理多个任务。.并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发的多个任务之间是互相抢占资源的。 并行的多个任务之间是不互相抢占资源的、
只有在多CPU的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。
线程安全和非线程安全
线程安全就是多线程访问,使用synchronized加锁机制,当一个线程访问某个数据的时,进行保护,其他线程必须等到该线程访问结束才能访问。
线程不安全就是不提供数据保护,多个线程同时对一个数据进行访问和修改导致的数据不一致。

浙公网安备 33010602011771号