javaSE之线程联合

时间:2022-05-05
本文章向大家介绍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 }