您的位置 首页 java

Java之线程,常用方法,线程同步,死锁

1, 线程的概念

进程与线程

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)

线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)

切换而不是同步

一个程序中的方法有几条执行路径, 就有几个线程

java 中线程的生命周期

Java之线程,常用方法,线程同步,死锁

Java线程具有五中基本状态

新建状态(New): 当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

就绪状态(Runnable): 当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

运行状态(Running): 当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞状态(Blocked): 处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2.同步阻塞 — 线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3.其他阻塞 — 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态(Dead): 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

2, 线程的创建:

Thread 类:

  • 已知直接子类:

  • ForkJoinWorkerThread

  • All Implemented Interfaces:

  • Runnable

  • java.lang.Object


  • 线程是程序中执行的线程。 Java虚拟机允许应用程序同时执行多个执行线程。

    每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。 每个线程可能也可能不会被标记为守护程序。 当在某个线程中运行的代码创建一个新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护线程。

    创建一个新的执行线程有两种方法。 一个是将一个类声明为 Thread 的子类。 这个子类应该重写 run 类的方法 Thread

    另一种方法来创建一个线程是声明实现类 Runnable 接口。 那个类然后实现了 run 方法。 然后可以分配类的实例,在创建 Thread 时作为参数传递,并启动。

  • java.lang.Thread

两种方式:

1, 继承Thread类

class TestThread extends Thread {……}

1 package com.hanqi.maya.test; 

2, 实现Runnable接口, 然后作为参数传入到Thread类的构造方法中

class TestThread implements Runnable {……}

1 package com.hanqi.maya.test; 

线程的启动:

调用线程类中的start()方法, 不能直接调用run()方法, 直接调用run()方法是方法调用, 不是启动线程

3, 线程常用方法

isAlive()

判断线程是否还活着, 调用start()之前和终止之后都是死的, 其他的都是活的

判断线程是否还在

1 package com.hanqi.maya.test; 

优先级

getPriority()

setPriority()

设置优先级, 优先级的概念: 谁的优先级高, 谁执行的时间就多

Thread里面的默认优先级:

Thread.MIN_PRIORITY = 1

Thread.MAX_PRIORITY = 10

Thread.NORM_PRIORITY = 5

1 package com.hanqi.maya.test; 

沉睡和终止

interrupt()

停止线程

这个方法要配合延迟使用,不要直接启动线程然后直接使用此方法

1 package interupt; 

Thread.sleep(long millions)将程序暂停一会,暂停当前线程,如果没有线程也可以给普通程序暂停,需要抛出一个异常即可

1 package com.hanqi.maya.test; 

join()

合并线程

1 package join; 

yield()—礼让

让出CPU执行其他线程

1 package com.hanqi.maya.test; 

wait()

  • 导致当前线程等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll() 方法,或指定的时间已过。

notify()

  • public final void notify() 

    唤醒正在等待对象监视器的单个线程。 如果任何线程正在等待这个对象,其中一个被选择被唤醒。 选择是任意的,并且由实施的判断发生。 线程通过调用 wait 方法之一等待对象的监视器。

    唤醒的线程将无法继续,直到当前线程放弃此对象上的锁定为止。 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步; 例如,唤醒的线程在下一个锁定该对象的线程中没有可靠的权限或缺点。

notifyAll()—

  • public final void notifyAll() 

    唤醒正在等待对象监视器的所有线程。 线程通过调用 wait 方法之一等待对象的监视器。

    唤醒的线程将无法继续,直到当前线程释放该对象上的锁。 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步; 例如,唤醒的线程在下一个锁定该对象的线程中不会有可靠的特权或缺点。

4, 线程同步

synchronized

线程的同步是保证多线程安全访问竞争资源的一种手段。

当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到的执行。

线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。

比如银行取钱:

银行卡余额3000,A从取款机取2000,B也想从支付宝这张卡转出2000,这时就要用到线程同步

线程同步,可以在方法声明中用 synchronized 关键字

也可以用 synchronized 关键字将代码块包起来实现

1 package com.hanqi.util; 

1 package com.hanqi.util; 

五、 死锁 概念

所谓死锁,是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源。两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

1 package com.hanqi.util; 

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,

需要突破技术瓶颈的可以加。2、在公司待久了,过得很安逸,

但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,

常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。

但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5. 群号:高级架构群 606187239备注好信息!

6.阿里Java高级大牛直播讲解知识点,分享知识,

多年工作经验的梳理和总结,带着大家全面、

科学地建立自己的技术体系和技术认知!

文章来源:智云一二三科技

文章标题:Java之线程,常用方法,线程同步,死锁

文章地址:https://www.zhihuclub.com/179547.shtml

关于作者: 智云科技

热门文章

网站地图