zoukankan      html  css  js  c++  java
  • javaSE之线程联合

            首先定义 : 一个线程A在占有CPU资源期间 ,可以让其他线程调用join()和本线程联合。

       嗯哈,像书本这个列子:

               如: B.join();

           我们称A在运行期间联合了B, 如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻

           中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行,

          如果A准备联合的B线程已经结束,那么B.join(),不会产生任何效果。

        

     1 package dialog_color;
     2 
     3 public class Example12_8 
     4 {
     5     public static void main(String args [])
     6     {
     7        ThreadJoin a = new ThreadJoin();
     8        Thread customer = new Thread(a);
     9        Thread cakeMaker = new Thread(a);
    10        customer.setName("顾客");
    11        cakeMaker.setName("蛋糕");
    12        a.setJoinThread(cakeMaker);
    13        customer.start();
    14     }
    15 }
    16 class ThreadJoin implements Runnable
    17 {
    18     Cake cake;
    19     Thread joinThread;
    20     public void setJoinThread(Thread it)
    21     {
    22       this.joinThread=it;
    23     }
    24     public void run() {
    25         // TODO Auto-generated method stub        
    26       if(Thread.currentThread().getName().equals("顾客"))
    27       {
    28           System.out.println(Thread.currentThread().getName()
    29                   +"等待"+joinThread.getName()+"制作生日蛋糕"); 
    30           try { 
    31               joinThread.start();
    32                joinThread.join();
    33             
    34         } catch (InterruptedException e) {
    35             // TODO Auto-generated catch block
    36         //    e.printStackTrace();
    37         }
    38         System.out.println(Thread.currentThread().getName()+"买了"+cake.name+"价钱: "+cake.price);
    39       }
    40       else if(Thread.currentThread()==joinThread)
    41       {
    42         System.out.println(joinThread.getName()+"开始制作生日蛋糕,请等待......");
    43         try {
    44             Thread.sleep(2000);
    45         } catch (InterruptedException e) {
    46             // TODO Auto-generated catch block
    47             e.printStackTrace();
    48         }
    49         cake=new Cake("生日蛋糕",158);
    50         System.out.println(joinThread.getName()+"制作完成!");
    51       }
    52     }
    53     
    54   class Cake    //内部类  相当于一个结构体) (c/c++)
    55   {
    56       int price ;
    57       String name;
    58       Cake(String name ,int price)
    59       {
    60         this.name=name;
    61         this.price=price;
    62       }
    63   }    
    64 }

     效果图:

    code:

     1 package tes;
     2 /*
     3  * 模拟这样一个过程
     4  * 一个老头去买蛋糕,蛋糕需要先做,
     5  * 老头等待做完,然后付款离开。
     6  * 
     7  * */
     8 public class Example12_9 {
     9 
    10     public static void main(String args [])
    11     {
    12      Thread aa,bb;
    13       JoinThread hehe = new JoinThread();
    14      aa = new Thread(hehe);
    15      bb = new Thread(hehe);
    16      aa.setName("老头");
    17      bb.setName("蛋糕师傅");
    18      hehe.setJoinThread(bb);
    19      aa.start();
    20     } 
    21 }
    22 class JoinThread implements Runnable
    23 {
    24     Thread myThread;
    25     cake mycake;
    26     public void setJoinThread(Thread name)    {
    27         myThread=name;
    28     }
    29     @Override
    30     public void run() {
    31         // TODO Auto-generated method stub
    32         if(Thread.currentThread().getName().equals("老头"))
    33         {
    34           print(Thread.currentThread().getName()+"等待蛋糕师傅制作蛋糕"
    35                   +myThread.currentThread().getName()+"开始制作蛋糕.....");
    36             //开始联合同步
    37           myThread.start();
    38           try {
    39             myThread.join();
    40         } catch (InterruptedException e) {
    41             // TODO Auto-generated catch block
    42             e.printStackTrace();
    43         }
    44           print(myThread.currentThread().getName()+"蛋糕做完..."
    45                   +Thread.currentThread().getName()+"买了"+mycake.name
    46                   +" 价钱:"+mycake.price);
    47         }
    48         else if(Thread.currentThread()==myThread)
    49         {
    50           print(myThread.currentThread().getName()+
    51                   "开始制作蛋糕,wait for minutes !");
    52           try {
    53             Thread.sleep(2500);
    54         } catch (InterruptedException e) {
    55             // TODO Auto-generated catch block
    56             e.printStackTrace();
    57         }
    58          print("蛋糕做完了"); 
    59          mycake = new cake("蛋糕",12.8);
    60         }
    61     }
    62    private  void print(String name){
    63      System.out.println(name);
    64    }
    65     class cake
    66     {
    67         String name;
    68         double price;
    69         cake(String name,double price){
    70           this.name=name;
    71           this.price=price;
    72         }
    73     }
    74 }
    View Code

  • 相关阅读:
    关于jabber协议
    xmpp相关链接,
    Implementation of the Server Dialback method as defined by the RFC3920
    好吧,隐藏的文件,
    Vue之methods watch和compute的区别和联系
    面向过程编程&面向对象编程
    JS高阶---线程与事件机制(小结)
    Vuex简介
    Vuex操作步骤
    vue单页面应用刷新网页后vuex的state数据丢失的解决方案
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3896061.html
Copyright © 2011-2022 走看看