`
shonghuanc
  • 浏览: 84241 次
文章分类
社区版块
存档分类
最新评论

线程小例子

阅读更多
//定义一个生产类
class Producer extends Thread
{  
     
    Producer()
    {
        setPriority(Thread.MAX_PRIORITY);
    }
     public void run()
     {
         Store store = new Store();
         for(int i=0;i <15;i++)
         {
            store.store_in();
         }
     }
}
//定义一个消费类
class Customer implements Runnable
{   
    long time = 100;
    Customer()
    {
    }
     public void run()
     {   
           try{
                Thread.sleep(time);
            }catch (InterruptedException e){throw new RuntimeException(e);} 
         Store store = new Store();
          for(int i=0;i <15;i++)
         {
            store.store_out();          
         }
     }
}

public class Store
{
     private static int productors = 0;
     private final int MAX_STORE = 10;
     private final int MIN_STORE = 1;
//定义一个同步入货方法
     public synchronized void store_in()
        {  
            if (productors >= MAX_STORE)
             {
                 try {
       System.out.println("库存数量太多!!!!!");
       wait();
                } catch (Exception e){}        
             }
            else
                {
      productors ++;
                    System.out.println("执行入库,库存数量为"+ productors);
                    notifyAll();
                }
        } 
//定义一个同步取货方法
     public synchronized void store_out()
     {
           if (productors  < MIN_STORE)
             { 
                 try {
                    System.out.println("库存数量不足!!!!!");
                     wait();
               }catch (Exception e){}   
             }
            else 
            {
                productors --;
                System.out.println("执行出库,库存数量为"+productors); 
                notifyAll(); 
             }
     }
//定义查库存方法
      public int getStore()
      {
          return productors;
      }
//主涵数,启动两个线程
     public static void main(String args [])
     {
         Producer p = new Producer();
         p.start();
         Store store = new Store();
         
        Thread c = new Thread(new Customer());
         c.start();
        System.out.println(store.getStore());
     } 
}

请问Thread C 如何唤醒Producer P,尽量给出修改结果,join()方法起什么作用,如何调,十分感谢


问题点数:120 回复次数:6 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复  


加为好友
发送私信
在线聊天
java2000_net
╔──────────╗  │老紫竹Java2000.net│  ╚──────────╝
等级:
发表于:2008-01-26 19:35:181楼 得分:0
notify();
notifyAll();

public final void notifyAll()
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。 

此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify 方法。


抛出:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
另请参见:
notify(), wait()

修改 删除 举报 引用 回复  

加为好友
发送私信
在线聊天
dongchaotiantian

等级:
发表于:2008-01-27 11:52:342楼 得分:0
能给出代码的修改结果吗

修改 删除 举报 引用 回复  

加为好友
发送私信
在线聊天
java2000_net
╔──────────╗  │老紫竹Java2000.net│  ╚──────────╝
等级:
发表于:2008-01-27 12:08:423楼 得分:0
你想在哪里唤醒?就在哪里写上这个代码!


Java codeStore store = new Store();
notifyAll();// 这样就行
for (int i = 0; i < 15; i++) {
    store.store_out();
}



修改 删除 举报 引用 回复  

加为好友
发送私信
在线聊天
java2000_net
╔──────────╗  │老紫竹Java2000.net│  ╚──────────╝
等级:
发表于:2008-01-27 12:09:154楼 得分:0
Java codeStore store = new Store();
for (int i = 0; i < 15; i++) {
    store.store_out();
    notifyAll();// 这样也许更好
}



修改 删除 举报 引用 回复  

加为好友
发送私信
在线聊天
dracularking
苦行魔君
等级:
发表于:2008-01-27 12:54:245楼 得分:0
join(): Waits for this thread to die.
假如在b线程区块中调用a.join(),就会阻塞当前b线程直至a线程运行完毕


Java codepublic class Test {
    public static void main(String[] args) {
        bao b = new bao();

        b.start();

        try {
            Thread.sleep(5000);
            b.join(100);
        }
        catch (Exception e) {
        }

        int i = 0;
        while (true) {
            System.out.println("mainThread: "
                    + Thread.currentThread().getName());
        }

    }
}

class bao extends Thread {
    public void run() {
        while (true) {
            System.out.println("run()Thread: "
                    + Thread.currentThread().getName());
        }
    }
}



以上例子副线程会一直运行直至5.1秒后停止阻塞 主副线程并行

修改 删除 举报 引用 回复  

加为好友
发送私信
在线聊天
caiming250
我坚强的爬了起来,拖着自己的尸体继续前进
等级:
发表于:2008-01-27 13:10:166楼 得分:0
危险...:
Java code

    // 定义一个同步入货方法
    public synchronized void store_in() {
        if (productors >= MAX_STORE) {
            try {
                System.out.println("库存数量太多!!!!!");
                wait();
            } catch (Exception e) {
            }
        } else {
            productors++;
            System.out.println("执行入库,库存数量为" + productors);
            notifyAll();
        }
    }
    // 定义一个同步取货方法
    public synchronized void store_out() {
        if (productors < MIN_STORE) {
            try {
                System.out.println("库存数量不足!!!!!");
                wait();
            } catch (Exception e) {
            }
        } else {
            productors--;
            System.out.println("执行出库,库存数量为" + productors);
            notifyAll();
        }
    }





这段代码危险!  wait(); 方法最好放在一个条件判断循环(while)里面   要不然 在notifyAll唤醒两个以上线程 取 访问productors 的时候会出现你不希望的结果

修改建议:

Java code
// 定义一个同步入货方法
    public synchronized void store_in() {
        try {
            while (productors >= MAX_STORE) {
                System.out.println("库存数量太多!!!!!");
                wait();
            }
            productors++;
            System.out.println("执行入库,库存数量为" + productors);
            notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 定义一个同步取货方法
    public synchronized void store_out() {
        try {
            while (productors < MIN_STORE) {
                System.out.println("库存数量不足!!!!!");
                wait();
            }
            productors--;
            System.out.println("执行出库,库存数量为" + productors);
            notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }




分享到:
评论

相关推荐

    QT多线程小例子.zip

    本例中的"QT多线程小例子.zip"提供了两种在QT中实现多线程的方法,适用于QT5.7.0版本。 首先,我们来看"01Thread"这个例子,它展示了QT4中的多线程处理方式。在QT4中,我们可以使用QThread类直接创建和管理线程。在...

    java 多线程小例子 很方便 很实用 适合初学者

    ### Java多线程小例子详解 #### 知识点一:基本多线程示例 在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,...

    多线程小例子

    本文将深入探讨“多线程小例子”所涉及的核心概念、原理及其实现方法,以帮助理解其在实际应用中的价值。 首先,我们需要理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。...

    Asp[1].net多线程小例子(含写日志).pdf

    Asp[1].net多线程小例子(含写日志).pdf

    Asp.Net 线程小例子

    以下是一个简单的线程创建和启动的例子: ```csharp using System.Threading; protected void Page_Load(object sender, EventArgs e) { // 创建一个新的线程 Thread myThread = new Thread(new ThreadStart...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    "鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地利用多线程技术来提高程序的执行效率和稳定性。在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源...

    一个关于多线程的小例子

    在这个小例子中,多线程被用来改善邮件发送功能,避免因长时间等待邮件发送而阻塞用户界面。 在Java中,实现多线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。由于Java的单继承特性,通常推荐使用实现`...

    mfc编写的用户界面多线程的小例子

    总结,MFC编写的用户界面多线程小例子是一个很好的学习资源,它演示了如何在MFC应用程序中实现多线程,以及如何在多线程环境下有效地管理用户界面。通过深入理解这个例子,开发者可以更好地掌握MFC和多线程编程,...

    线程同步小例子

    这个“线程同步小例子”是基于孙鑫先生著作中的示例进行改进的,旨在帮助我们深入理解线程同步的机制和实践。 线程同步的主要目标是控制线程对共享数据的访问,以防止不正确的数据状态。在多线程环境下,如果多个...

    易语言-多线程小例子之多线程Ping延迟测速

    在“易语言-多线程小例子之多线程Ping延迟测速”这个示例中,我们将探讨如何利用易语言实现多线程来检测多个IP地址的延迟,以找出延迟最低的IP。 易语言是中国本土开发的一种可视化编程语言,它的语法简洁明了,...

    多线程小例子之多线程Ping延迟测速-易语言

    《多线程小例子之多线程Ping延迟测速——易语言实现详解》 在IT领域,多线程编程是一项核心技能,它能够充分利用多核处理器的计算能力,提高程序的执行效率。在这个实例中,我们将探讨如何使用易语言实现多线程 ...

    易语言大漠多线程例子.rar

    这个"易语言大漠多线程例子.rar"压缩包包含了一个使用大漠插件实现多线程编程的示例项目。 多线程是现代程序设计中一个关键的概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在易语言中,使用大漠...

    DELPHI 线程技术 例子

    在DELPHI线程技术的例子中,源代码可能会展示如何在不同线程间共享数据,如何使用上述同步机制确保数据安全,以及如何正确地终止线程。开发者应当关注线程的生命周期管理,避免内存泄漏和资源竞争问题。 此外,线程...

    C#多线程的小例子

    这个例子虽然简单,但它提供了一个了解C#多线程基本操作的起点,包括线程创建、参数传递、同步机制以及与UI交互。在实际应用中,开发者还需要考虑更多的线程管理、异常处理以及性能优化等问题。

    三个C#线程的例子三个C#线程的例子三个C#线程的例子

    下面将详细讲解三个C#线程的例子,以帮助理解如何在C#中管理和使用线程。 ### 例子1:后台线程(Background Thread) 在C#中,可以通过`System.Threading.Thread`类创建一个新的线程。以下是一个简单的后台线程...

    java多线程例子

    Java 多线程例子 Java 多线程是 Java 编程语言中的一种基本概念,它允许程序同时执行多个任务,从而提高程序的性能和效率。本文将通过三个实用的例子,讲解 Java 多线程的基本概念和使用方法。 第一个例子:创建多...

Global site tag (gtag.js) - Google Analytics