Java并发之基础知识

作者 : 开心源码 本文共2013个字,预计阅读时间需要6分钟 发布时间: 2022-05-12 共171人阅读

一. 线程的创立方式

1.1继承Thread类

重写run()方法就可。

public class MyThread extends Thread {    @Override    public void run() {        System.out.println("MyThread is running!");    }    public static void main(String[] args) {        MyThread myThread = new MyThread();        myThread.start();    }}
1.2实现Runnable接口
public class MyRunnable implements Runnable {    @Override    public void run() {        System.out.println("MyRunnable is running");    }    public static void main(String[] args) {        Thread myRunnable = new Thread(new MyRunnable());        myRunnable.start();    }}

2 线程的5个状态

新建
当用new操作符创立一个线程对象后,如new Thread(r),还没有调用start()方法之前的状态

可运行
调用start()方法之后且没有被阻塞,也没在等待某个条件。可能正在运行也可能没有运行(等待CPU时间片)。在CPU分配时间片给多个线程,使它们轮流执行的过程中,不过实际有没有运行都处于可运行状态。

阻塞
当一个线程视图获取一个内部对象锁(synchronized),而该锁被其它线程持有,则该线程进入阻塞状态。内部对象锁是使用monitor对象实现的,每个monitor维持两个队列,一个是entry_list,一个wait_list。分别用于保存想获取锁的线程和等待条件的线程。(wait_list中的线程处于等待态)。

等待
等待一个条件时。1.Object.wait方法,进入wait_list队列,等待调用Object.notify()或者Object.notifyAll()方法。2.等待ReentryLock或者Condition时。3.调用Thread.join()方法

计时等待
有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。这一状态将一直保持到超时期满或者者接收到适当的通知。
这些方法有:Thread.sleep,Object.wait、Thread.join、Lock.tryLock、Condition.await等方法的计时版。

终止
线程因两个起因之一被终止

  • 由于run方法正常退出而自然结束
  • 由于一个没有捕获的异常终止了run方法而意外死亡

3 Object类中线程相关的方法

3.1 wait()方法

线程调用一个对象的wait()方法之前需要先获取到这个对象的内部对象锁,否则会抛出IllegalMonitorStateException异常。另一个可能的异常是:InterruptedException

调用这个方法使线程进入等待状态,在对象monitor对象的等待队列里默默等待,别的线程调用notify()或者notifyAll()方法来唤醒。并且会释放获取到当前对象的锁。

这个方法常常用来等待某个条件的满足:

synchronized(obj) {  while(条件不满足) {      obj.wait()   }  //满足条件了,尽情干想干的事吧!}

它还有个带计时的版本wait(long timeout),这是个native方法,是wait的真正实现。其实wait的实现就是调用了wait(0)而已。

3.2 notify()方法

和wait()方法配合使用。随机唤醒在对象monitor等待队列中一个线程。
同样需要先获取内部对象锁才能调用,否则会抛出IllegalMonitorStateException异常。
唤醒只是将线程从等待态切换到Runnable(可运行)态,不肯定保证能立马执行(还有CPU分配时间片的因素)
调用此方法不会释放内部对象锁。

3.3 notifyAll()

唤醒所有的等待线程。
调用此方法需要先获取内部对象锁。
调用此方法不会四方内部对象锁。

4 Thread类中线程相关的方法

4.1 sleep(long millis)方法

方法公告:

public static native void sleep(long millis) throws InterruptedException;

是个静态方法,通过Thread.sleep()调用。使当前线程休眠指定时间再进入runnable状态。调用后进入阻塞态,不会释放内部对象锁。

4.2 join()方法

方法公告:

public final void join() throws InterruptedException ;

当前线程调用指定线程的join()方法,会等待该线程结束后再继续执行。
join方法还有一个带参数的版本,等待线程结束或者到达指定时间再继续执行。
调用join后进入阻塞状态。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Java并发之基础知识

发表回复