星空网 > 软件开发 > Java

Java并发编程1——线程状态、synchronized

 

    以下内容主要总结自《Java线程编程核心技术》,不定时补充更新。

 

一、线程的状态

    Java中,线程的状态有以下6类:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。各状态之间的关系可用下图表示:

Java并发编程1——线程状态、synchronized

 

二、常用方法介绍

1、thread.start()和thread.run()的区别

1 public static void main(String[] args) {2     Thread t = new Thread();3     t.start();4     System.out.println("main end");5   }

调用start()方法启动线程t,t线程的状态会从New -> Runnable,t线程和main主线程同时执行。

如果把t.start()改成t.run(),则是普通的调用方法,同步执行,System.out.println("main end")语句必须等t.run()方法执行完毕之后才能执行。

注意:t.run()方法不会改变线程t的状态,也就是说线程没有启动。

 

2、object.wait()和thread.sleep()的区别

Java并发编程1——线程状态、synchronized
1 private Object obj = new Object();2 public void testMethod() throws InterruptedException {3   synchronized (obj) {4     obj.wait();5     System.out.println("testMethod end");6   }7 }
Java并发编程1——线程状态、synchronized

wait()方法主要用在synchronized同步方法或者同步块中,意味着调用object.wait()之前必须先获取锁,调用wait()方法之后释放锁,线程进入waiting状态。常见用法如上所示。如果有其他线程通过调用object.notify()或者object.notifyAll()方法时,线程必须再次获取到obj锁,然后才能继续执行obj.wait()后的语句,即打印 "testMethod end"。obj.wait(timeout)方法类似,也需要先释放锁。

wait()方法是Object类的方法,而sleep(timeout)方法是Thread类的方法。线程调用sleep(timeout)方法,状态从runnable -> timed_waiting,但是不释放锁。

 

3、interrupt()方法

    当线程调用interrupt()方法时,只是设置了线程的中断状态。 也就是说如果线程处于runnable或者blocked状态的时候,调用interrupt()方法并不会终止线程。于是,我想当然的理解如果线程处于waiting或者timed_waiting状态时,调用interrupt方**抛出异常,从而终止线程。

    然后发现错了。见如下代码:

Java并发编程1——线程状态、synchronized
 1 private ReentrantLock lock = new ReentrantLock(); 2 private Condition condition = lock.newCondition(); 3 public void testMethod() { 4   try { 5     lock.lock(); 6     System.out.println("wait begin"); 7     condition.awaitUninterruptibly(); 8     System.out.println("wait end"); 9   } finally {10     lock.unlock();11   }12 }
Java并发编程1——线程状态、synchronized

    condition.awaitUninterruptibly()方法不需要捕获InterruptedException异常,意味着如果线程通过调用awaitUninterruptibly从而使得线程状态为waiting,并不会因为调用interrupt()方法而中断。实际测试,线程状态不响应interrupt方法,只有通过condition.singal或者singalAll才能唤醒线程。

    实际测试,wait(), wait(timeout), join(), sleep(timeout), await(), await(timeout)等方法都是可以被interrupt()方法中断的。

 

三、synchronized关键字

1、synchronized(object): 同步方法或者代码块,锁是一个对象。

2、synchronized(this): this指的是当前对象。

3、针对静态方法,比如synchronized public static void testMethod(),锁是当前的Class类。

4、如果代码抛出异常,锁自动释放。





原标题:Java并发编程1——线程状态、synchronized

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

物流实:https://www.goluckyvip.com/tag/9312.html
出口跨境电商物流:https://www.goluckyvip.com/tag/93120.html
出口物流跨境电商:https://www.goluckyvip.com/tag/93121.html
跨境出口电商物流:https://www.goluckyvip.com/tag/93122.html
跨境电商出口物流:https://www.goluckyvip.com/tag/93123.html
出口电商跨境物流:https://www.goluckyvip.com/tag/93124.html
深圳西乡三月三北帝庙会的千岁盆菜多少钱:https://www.vstour.cn/a/365180.html
TikTok SEO:TikTok会取代谷歌吗?:https://www.kjdsnews.com/a/1836538.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流