**JAVA** Thread系列一
来源:互联网 发布:php-> 编辑:程序博客网 时间:2024/06/07 17:00
> 线程和进程
>>相关的概念
进程:是一个正在执行中的程序,美国一个进程的执行,都有一个执行的顺序,该顺序是一个执行路径,或者叫一个控制单元。一个进程中出现多条执行路径,比如迅雷支持多条线程同时下载。线程是进程中的控制单元或执行路径。
线程:进程中一个独立的控制单元,线程在控制着进程的执行。一个进程中至少有一个线程。
java VM 启动时会有一个进程java.exe,该进程中至少有一个线程,在负责java程序的执行。而且这个线程运行的代码在main方法中。该线程称之为主线程。
补充:虚拟机在启动的时候不止一个线程,还有负责垃圾回收的线程已经同时启动。
>>多线程的意义
使多个代码和程序能够同时执行,而且有利于提高代码的执行效率。
>如何自定义控制单元(线程)
>>类java.lang.thread
通过API查找,java通过thread类创建线程有两种方式
1.定义类继承thread类->复写Thread类中的run方法->调用线程的start方法(该方法有两个作用:启动线程,调用了run()方法)
class Demo extends Thread{public void run(){}}
注意:每次执行的结果都不一样,因为cpu每次对不同线程的分配是随机的,单核处理器每一时刻都只能执行一个线程,cpu在不同的
线程之间切换,达到同时运行的效果。
多线程的一个特性: 随机性。
覆盖run方法的原因:
Thread用于描述线程,该类定义了一个功能,用于存储线程要寻星的代码。该存储功能就是run方法。
>>Tread线程所有可能出现的状态:
run方法用于存储线程要运行的代码。但是不能直接执行run方法,不开启线程。run处于运行状态。
sleep(time)线程冻结睡眠的时间(主动放弃执行状态)
wait()冻结等待一定的时间(主动放弃执行状态)
notify()冻结后唤醒线程
stop()线程消亡或者run方法结束的时候线程消亡
临时状态或阻塞状态:线程被start之后不一定立刻执行,处于被其他线程占据cpu执行权,具备被运行资格但没有执行权。
>>创建线程的第二种方法
currentThread()静态方法返回当前的线程
setName()设定线程的名称
getName()取得线程的名称
Thread(String name)用名称初始化线程
>>实现Runable接口
步骤:
定义类实现runnable接口
覆盖Runnable接口中的run方法
通过Thread类建立线程对象
将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
实现方式好继承方式的区别:
接口可以无限添加,克服单继承的局限性。
在定义线程时,建议使用实现方式
线程的代码存放位置不一样。
继承Thread:线程代码存放在Thread子类的run方法张
实现Runnable,线程存放在接口的run方法中
多线程在卖票过程中出现了安全问题,当判断结束后切换到其他程序,会导致程序无法执行完成。执行其他完成后
此数据可能已经不再合适。
问题原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句执行了一部分,还没有执行完,另一个线程进来执行
导致共享数据的错误。
解决办法:
对多条操作贡献数据的语句,只能让一个线程都执行玩。在执行过程中,其他线程不能参与执行。
java对于多线程的安全问题提供了专业的解决方式:同步代码块。
对象如同锁,持有锁的线程能够在同步中执行,没有持有锁的线程即使获取了cpu的执行权,也无法执行。
同步代码块:
synchronized(对象)
{锁旗标(用来监听是否有人进来,作为一种标志位)
需要被同步的代码。
}
同步函数:
public synchronized void add(){}
补充:
同步代码块的参数对象是锁的对象。
同步函数的默认锁是this。
同步函数的锁被静态方法static修饰后,内存中没有本类的对象,但一定有该类对应的字节码文件对象。
类名.class,该对象的类型是Class。所以静态同步方法使用的锁是该方法所在类的字节码对象。
同步设置的前提:
必须有两个或者两个以上的线程。
必须是多个线程使用同一个锁(共享的数据)
必须保证同步中只有一个线程在执行。
优点:
解决了多线程的安全问题
缺点:
消耗了资源,多个线程要判断锁的存在
- **JAVA** Thread系列一
- **JAVA** Thread系列二
- Thread系列1-浅析 Java Thread.join()
- C#Thread类多线程系列(一)入门
- 学习Java中的多线程编程系列(一):Thread和Runnable
- Java Thread学习历程一
- Java线程Thread(一)
- (一)java多线程之Thread
- (一)java多线程之Thread
- Java源码心中有数系列 java.lang.thread
- **JAVA** Thread系列四 多线程的应用
- java Thread类 线程学习 一:
- Java学习 - Thread Synchronized (一)
- Java多线程之Thread(一)
- Java线程基础(一):Thread和Runnable
- Java多线程 之 Runnable Thread (一)
- java Thread的探索(一)
- Java笔试 系列一
- 小酌Activity生命周期
- ubuntu 16.04[LTS] Shadowsocks + ProxyChain +Genpac 翻越GFW
- 剑指offer(20)-数组中只出现一次的数字
- mysql自动分区应用实例
- july:微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相
- **JAVA** Thread系列一
- theano scan 实例
- Android Studion 中的错误 Plugin Error
- CSS属性
- Android SQLite SQL语句高级进阶
- Linux内核分析01-分析汇编代码理解计算机是如何工作
- POJ 1328 Radar Installation 区间贪心
- 哈希表用于数据索引
- JAVA学习的第二天