知识大全 Java 线程缺陷和副作用的解决办法(2)

Posted 生产者

篇首语:不登高山,不知天之高也;不临深溪,不知地之厚也。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java 线程缺陷和副作用的解决办法(2)相关的知识,希望对你有一定的参考价值。

Java 线程缺陷和副作用的解决办法(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  表A: 演示高级线程方法的伪代码

  class ProdCons      class List        public synchronized boolean add(Object o)         public synchronized boleanremove (Object o)            List data = new List();   ProdThread producer = null;   ConsThread consumer = null;   ProdCons()         producer = new ProdThread(this);    consumer = new ConsThread(this);    producer start();    consumer start();         消费者和生产者的类 请见表B和表C

  表B: Class ConsThread

  class ConsThread extends Thread      ProdCons parent;   ConsThread(ProdCons parent)        this parent = parent;      public synchronized void canConsume()        notify();      public void run()        boolean consumed;    do           synchronized(this)             try wait();           catch (Exception e) ;           do          String str = (String)parent list remove();     if ( null == str)             consumed = false;      break;          consumed = true;     System out println( Consumer=>consumed + str);        while ( true );       while (consumed);     表C: Class ProdThread

  class ProdThread extends Thread      ProdCons parent;   ProdThread(ProdCons parent)        this parent = parent;      public void run()        for ( int i = ; i < ; i++)          String str = new String( ImAString + i);     System out println( Producer produced + str);     parent list add(str);     parent consumer canConsume();        parent consumer canConsume();       注意 notify和wait两个API都必须位于同步化(synchronized)的方法中或者代码块中!

  线程和Sun JDK   线程提供了一项很有价值的服务 极大地增强了Java程序设计语言的功能 然而 目前的线程实现的确存在一些问题 这些问题的存在 使得Sun JDK 中线程的stop suspend和resume方法导致人们的批评

  如果我们回到上面的生产者/消费者例子 我们就可以更好地理解这个问题 首先 我们看看死锁 当运行一个applet小程序时 在通常的情况下 两个线程运行时 相安无事 但是 但用户点击到另外一个网页时 问题出现了 如果生产者正在添加一个项目到列表中 最坏的情况就是消费者线程被阻塞 假定 小程序正在创建一个对象 此时突然被挂起(suspended) 其他的小程序就不能再对该数据进行更新 尽管出现这样的机会不多 它们的确存在 有时会引起问题

  线程的第二个问题有关不一致的问题 再来看一下生产者/消费者的例子 不难想象 如果生产者线程在添加项目的过程中遇到被中止的情况 可能会造成列表状态不一致 如果我们全面检查现有的Java小程序的个数 就不难发现问题所在

  处理这个不一致的问题的最简单的方法就是派生一个新的线程类 该线程类具有如下功能 通过一个方法的调用可以改变其状态 表D就定义了这样的一个类 MyThread类可以被挂起和重新执行 而无需担心MyThread类的资源会崩溃 MyThread类中的方法 changeState用于暗示应该暂停 停止或者重新执行线程 而不同于以往的停止或者暂停线程 可以向线程发出请求 要求线程在合适的时候处理该请求 而不是强制处理该请求 因而无需向线程发出停止命令

  表D: Class MyThread

  public class MyThread extends Thread      //States the thread can be in    static final int STATE_RUNNING = ;   static final int STATE_STOP = ;   static final int STATE_SUSPEND = ;   private int currentState = STATE_RUNNING;   // The public method changeState allows    // another process to poke at that hread   // and tell it to do something when it    // next gets a chance    public final synchronized void    changeState(int newState)        currentState = newState;    if (STATE_RUNNING == currentState)    notify();     // Must have been suspended       private synchronized boolean currentState()        // If we where asked to suspend     // just hang out until we are     // asked to either run or stop     while ( STATE_SUSPEND == currentState)          try wait();      catch (Exception e) ;        if ( STATE_STOP == currentState )    return false;    else    return true;      public void run()        do          if (currentState() == false)     return; // Done     // Perform some work           while (true);     

  MyThread类的用户可以重载run方法 然而 用户需要检查是否有另外的类请求线程改变状态 在JDK 中对线程的运行机制所做的改变 是问题的症结所在 线程在运行时是否出现不一致 在线程关闭后 是否放弃所占用的资源 线程的运行是否正常 这些工作都是要开发者自己来确保完成了

cha138/Article/program/Java/gj/201311/27773

相关参考

知识大全 Java线程模型缺陷研究[2]

Java线程模型缺陷研究[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 在Java平台上进行多线程编程的缺陷[2]

在Java平台上进行多线程编程的缺陷[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  争用条

知识大全 Java 线程/内存模型的缺陷和增强

Java线程/内存模型的缺陷和增强  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java在语言

知识大全 Java线程模型缺陷研究[6]

Java线程模型缺陷研究[6]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[5]

Java线程模型缺陷研究[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[4]

Java线程模型缺陷研究[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[3]

Java线程模型缺陷研究[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[1]

Java线程模型缺陷研究[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[7]

Java线程模型缺陷研究[7]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 在Java平台上进行多线程编程的缺陷

在Java平台上进行多线程编程的缺陷  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Java语言的并