线程的并发执行,线程状态 java

  线程的并发执行,线程状态 java

  00-1010线程状态概述睡眠睡眠方法等待和唤醒等待唤醒的小例子

  

目录

线程由生到死的完整过程:

 

  当线程被创建和启动时,它既不会一启动就进入执行状态,也不会一直处于执行状态。在一个线程的生命周期中,有多少种状态?在API java.lang.Thread.State中,此枚举给出了六种线程状态:

  线程导致状态发生条件NEW(新)。线程刚刚创建,但还没有开始。尚未调用start方法。MyThread t=new MyThread只有线程对象,没有线程特性。一个可运行线程在java虚拟机中运行的状态可能是也可能不是运行它自己的代码,这取决于操作系统处理器。调用了t.start()方法:ready(经典教法)Blocked(锁阻塞)当一个线程试图获取一个对象锁,而该对象锁被其他线程持有时,该线程进入阻塞状态;当线程持有锁时,线程将变得可运行。等待(无限等待)当一个线程正在等待另一个线程执行(唤醒)动作时,该线程进入等待状态。进入这种状态后,就不能自动醒来了。您必须等待另一个线程调用notify或notifyAll方法,然后才能唤醒。定时等待和等待的状态是一样的。有几个带超时参数的方法,调用它们会进入定时等待状态。这种状态将保持到超时期满或收到唤醒通知。带有超时参数的常见方法有Thread.sleep和object . wait terminated(terminated)由于run方法正常退出而终止,或者由于未捕获的异常终止了run方法而终止。

  00-1010状态中有一种叫定时等待,可以用Thread类的方法演示。公共静态void sleep(长时间)使当前线程进入睡眠状态,毫秒后自动唤醒继续执行。

  //主线程执行sleep方法时,会休眠1秒,然后继续执行公共类test { public static void main(string[]args){ for(int I=1;I=5;I){ thread . sleep(1000);System.out.println(i) } }

  00-1010 public void wait () :让当前线程进入等待状态。此方法必须锁定对象调用。

  class demo 1 _ wait { public static void main(string[]args)抛出中断异常{/Step 1 :子线程打开,进入无限等待状态,未被唤醒,无法继续运行。new thread(()-{ try { system . out . println( begin waiting . )))同步(“”){“”。wait();} system . out . println( over );} catch(异常e) { } })。start();}public void notify():唤醒等待当前锁定对象的线程。此方法必须锁定对象调用。

  class demo 2 _ notify { public static void main(string[]args)抛出中断异常{//Step 1 :子线程打开,进入无限等待状态,未被唤醒,无法继续运行;new thread(()-{ try { system . out . println( begin wait . ));已同步(“”){“”。wait();} system . out . println( over );} catch(异常e) { } })。标准时间

  art(); //步骤2: 加入如下代码后, 3秒后,会执行notify方法, 唤醒wait中线程. Thread.sleep(3000); new Thread(() -> { try { synchronized ("") { System.out.println("唤醒"); "".notify(); } } catch (Exception e) { } }).start(); }}

 

  

等待唤醒的一个小例子

定义一个集合,包子铺线程完成生产包子,包子添加到集合中;吃货线程完成购买包子,包子从集合中移除。

 

  当包子没有时(包子状态为false),吃货线程等待.包子铺线程生产包子(即包子状态为true),并通知吃货线程(解除吃货的等待状态)

public class BaoZiPu extends Thread{ private List<String> list ; public BaoZiPu(String name,ArrayList<String> list){ super(name); this.list = list; } @Override public void run() { int i = 0; while(true){ //list作为锁对象 synchronized (list){ if(list.size()>0){ //存元素的线程进入到等待状态 try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果线程没进入到等待状态 说明集合中没有元素 //向集合中添加元素 list.add("包子"+i++); System.out.println(list); //集合中已经有元素了 唤醒获取元素的线程 list.notify(); } } } }}
public class ChiHuo extends Thread { private List<String> list ; public ChiHuo(String name,ArrayList<String> list){ super(name); this.list = list; } @Override public void run() { //为了能看到效果 写个死循环 while(true){ //由于使用的同一个集合 list作为锁对象 synchronized (list){ //如果集合中没有元素 获取元素的线程进入到等待状态 if(list.size()==0){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果集合中有元素 则获取元素的线程获取元素(删除) list.remove(0); //打印集合 集合中没有元素了 System.out.println(list); //集合中已经没有元素 则唤醒添加元素的线程 向集合中添加元素 list.notify(); } } } }}
public class Demo { public static void main(String[] args) { //等待唤醒案例 List&lt;String&gt; list = new ArrayList&lt;&gt;(); // 创建线程对象 BaoZiPu bzp = new BaoZiPu("包子铺",list); ChiHuo ch = new ChiHuo("吃货",list); // 开启线程 bzp.start(); ch.start(); }}

到此这篇关于Java并发编程之线程状态介绍的文章就介绍到这了,更多相关Java 线程状态内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: