Java并发之基础知识
一. 线程的创立方式
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并发之基础知识