java面向对象高级进程与线程

进程

概念

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在windows系统中,一个运行的exe就是一个进程。

线程

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进行的内存。“同时执行”是人的感觉,其实是线程之间实际上轮换执行。

 

线程实现

定义线程

线程有两种方式

1.     扩展java.lang.Thread类

2.     实现java.lang.Runable接口

实例化线程

1.     如果是扩展java.lang.Thread类的线程,则直接new即可。

2.     如果是实现了java.lang.Runable类的接口,则用Thread的构造方法:

Thread(Runnable target)

Thread(Runnable target, String name)

Thread(ThreadGroup group, Runnable target)

Thread(ThreadGroup group, Runnable target, String name)

Thread(ThreadGroup group, Runnable target, String name,long stackSize)

启动线程

在线程的Thread对象上调用start()方法,而不是run()或者别的方法。

在调用start()之前:线程处于新状态中,新状态指有一个Thread对象,但是还没有一个真正的线程。在调用start()方法之后:发生了一些列复杂的事情,该线程从新状态转移到可运行状态;当线程获得机会执行时,其目标Run()方法运行

注意:对java来说,run()方法没有任何特别之处。就像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runable上或者Thread上调用run方法时合法的。但是并不启动新的线程。

线程的状态


新状态(new)

线程对象已经创建,还没有在其上调用start()方法

可运行状态(Runnable)

当线程有资格运行,但调度程序还没有把它选定为运行线程时所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或者睡眠状态回来,也可返回到可运行状态。

运行状态(Running)

线程调度程序从可运行池中选择一个线程作为当前线程时所处的状态。这也是线程进入运行状态的唯一一种方式。

等待/阻塞/睡眠状态(Watiing/Timed_waiting/Blocked)

这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,共同点是:线程仍旧是获得,但是当前没有条件运行。换句话说,他是可运行的,如果某件事件出现,他可能返回到可运行状态。

死亡态(terminated)

当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

线程同步

线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。

锁的原理

Java中每个对象都有一个内置锁

当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁,锁定对象,在对象上锁定或在对象上同步。

当程序运行到synchronized同步方法或代码块时,该对象锁才起作用。

一个对象只有一个锁。所以,如果一个线程获得该所,就没有其他线程可以获得锁,知道第一个线程释放锁。这也意味着人户其他线程都不能进入该对象上的synchronized方法或代码块,知道该锁被释放。

释放锁是指:持锁线程退出了synchronized同步方法或代码块。

关于锁和同步,由一下几个要点

1.     只能同步方法,不能同步变量和类;

2.     每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说在哪个对象上同步。

3.     如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,知道锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程进入(该对象)类中的任何一个同步方法。

4.     线程睡眠时,它所持的任何锁都不会释放。

5.     同步损害并发性,所以应该尽可能缩小同步范围。同步不但可以同步整个方法,还可以同步方法中一部分代码块。

6.     在是用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。

举例:用多线程模拟3个窗口售卖火车票


当一个类已经很好的同步以保护它的数据时,这个类就被称为“线程安全的”。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值