* 1)线程:通过thread对象表示
* 2)线程任务:通过Runnable对象表示
*
*
* java开启新线程的方式
* 1)新定义类实现Runnable接口
* 2)新定义类继承Thread类
*
*
* 新定义类实现Runnable接口方式的步骤
*
* 1)新定义任务类实现Runnable接口-重写run方法
* class 任务类名 implements Runnable{//重写run方法}
* 2)创建新定义任务类的任务对象
* new 任务类名()
* 3)创建线程对象绑定任务对象
* new Thread(任务对象);
* 4)开启线程-执行对应的任务
* 线程对象.start();
* 注意点:start开启线程,线程不会马上执行。等待分配cpu资源分配之后再继续执行(一般等待的时候比较少)
*
*
* 线程执行的代码
* main线程:执行的是main方法
* 新开thread线程:执行的是run方法
2.线程的状态
*
* 1)新建:线程对象刚创建出来
* 2)可运行:线程可以运行了,没有分配到cpu资源
* 3)运行:线程正在执行代码
* 4)死亡:线程死掉了,结束了。
* 5)阻塞:线程暂停执行 了。
3. 线程在执行代码的时候-需要cpu的使用权
*
* cpu的使用权-》根据线程的优先级分配的
*
* 线程的优先级越高-》分配的机会越多
*
* java线程的优先级级别:1(最小)到10(最大)
*
* 线程默认优先级-》5
*
* 更改线程优先级
* api:setPriority(int newPriority)
*
*
* 常用的优先级-有对应常量
*
static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
4.线程都是有一个名字的
*
* 1)创建线程的时候-可以初始化名字:
* Thread(Runnable target, String name)
Thread(String name)
2)可以再次更改名字
setName
3)获取名字
getName
5.synchronized关键字概念
* 保证某一个对象的同步代码(所有的synchronized修饰的代码)在某一个时刻只会被一个线程执行,其他线程只能等待执行完成才可以执行。
*
* 对象锁:执行同步代码的时候需要把对象锁住。 1)每个对象都有一个对象锁
* 2)线程在执行对象synchronized修饰的代码时,会先【自动获取对象锁】,然后把该对象的synchronized修饰的所有代码锁住
* 3)执行完成synchronized代码后会【自动释放对象锁】,其他线程才可以继续【自动获取对象锁】,
* 然后其他线程把该对象的synchronized修饰的所有代码锁住。
*
* synchronized
* 关键字:会【自动获取锁和释放锁】,也可以手动获取和释放!java.util.concurrent.locks包提供了丰富的支持。
*
*
* synchronized的使用
* 1)synchronized块
* 语法:synchronized(被锁的对象){
* //同步执行的代码
* }
*
* 被锁的对象:多个线程操作的同一个对象
* 同步执行的代码:多个线程执行的时候,只能一个线程执行,其他线程等待的代码
6.线程安全问题
*
* -->线程不安全
* Stringbuilder,ArrayList,HashMap
*
* -->线程安全
* Stringbuffer,Vector,Hashtable
*
*
* 线程不安全:该类操作对象的代码没有进行同步(synchronized),多个线程操作同一个对象,
* 可能出现不安全的情况,该对象只能在同一个线程使用才安全。
*
* 线程安全:该类操作对象的代码通过(synchronized)进行同步,多个线程操作同一个对象,
* 有线程使用对象的同步功能,其他线程等待,保证操作安全,该对象可以在多线程使用。
7.死锁描述: 多个线程,都抢占了对方的资源,又都等待对方释放资源。
死锁原因: 死锁是逻辑问题造成的!
解决办法:让一方先释放资源。
常见死锁:synchronized嵌套加thread.sleep
例子:如两个人分别拿着水和食物,都不放手,又都等待对方释放资源!!形成循环等待
7.线程相关概念
1、程序、进程、线程对比
a)程序:
Java源程序和字节码文件被称为“程序” (Program),是一个静态的概念。------>硬盘上的可执行的文件
b)进程:
执行中的程序叫做进程(Process),是一个动态的概念。
- 进程是程序的一次动态执行过程, 占用特定的地址空间.
- 每个进程由3部分组成(系统分配):cpu,data,code。每个进程都是独立的,保有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西。 缺点:内存的浪费,cpu的负担
- 多任务(Multitasking)操作系统将CPU时间动态地划分给每个进程,操作系统同时执行多个进程,每个进程独立运行。以进程的观点来看,它会以为自己独占Cpu的使用权
- 进程的查看
- Windows系统: Ctrl+Alt+Del
- Unix系统: ps or top
c)线程:
- 线程是进程中一个“单一的连续控制流程--》代码的执行者”, (a single sequential flow of control)/执行路径。线程也可以达到同一份程序产生好几个进程的效果,但是不同的线程之间可以有某种程度上的资源共享,所以线程又被称为轻量级进程(lightweight process)。
- Threads run at the same time, independently of one another
- 一个进程可拥有多个并行的(concurrent)线程
- 一个进程中的线程共享相同的内存单元/内存地址空间,
可以访问相同的变量和对象,而且它们从同一堆中分配对象的通信、数据交换、同步操作
- 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
2、进程与程序的区别
程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。
一般说来,一个进程肯定与一个程序相对应,并且只有 一个,但是一个程序可以有多个进程,或者一个进程都没有。
简单地说,进程是程序的一部分,程序运行的时候会产生进程。
3、线程进程的概念理解
例如:我们做项目分成几个小组,每个小组做一个项目,每个小组的组员一起合作做一个项目。
这里例子里!
进程:就是每一个小组,因为他们独立完成各自项目,互相不干扰,比如你们小组的项目
不会交给别的小组乱搞!!!
线程:就是每一个小组里的各个组员,他们都是做项目人,同一个组的各个人要互相配合
来完成项目,互相影响,使用统一的资源,比如你的代码,别人可以看也可以改!
4、并发编程:多个执行运算单元配合完成程序工作
a)多进程开发:进程之间资源独立(cpu和内存)
进程之间通信:可以通过后面讲解的socket完成通信!
b)多线程开发:线程之间资源共享(cpu和内存)
线程之间通信:可以共享内存(对象)数据完成。
c)多线程多进程对比:
进程优点:编程、调试简单,可靠性较高。
进程缺点:创建、销毁、切换速度慢,内存、资源占用大。
线程优点:创建、销毁、切换速度快,内存、资源占用小。
线程缺点:编程、调试复杂,可靠性较差。
d)总结:线程快而进程可靠性高
好处: 多个执行单元同时工作,可以使得我们程序的性能提高。
例如:
1)解析5个文件内容并输出。
2)计算1-500000的累加。