**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。所以静态同步方法使用的锁是该方法所在类的字节码对象。

同步设置的前提:

必须有两个或者两个以上的线程。

必须是多个线程使用同一个锁(共享的数据)

必须保证同步中只有一个线程在执行。


优点:

解决了多线程的安全问题

缺点:

消耗了资源,多个线程要判断锁的存在



0 0
原创粉丝点击