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 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iKcamp

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 7 章: 闭包 vs 对象

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 7 章: 闭包 vs 对象 ...

26470
来自专栏技术墨客

Java函数式开发——优雅的Optional空指针处理

    在Java江湖流传着这样一个传说:直到真正了解了空指针异常,才能算一名合格的Java开发人员。在我们逼格闪闪的java码字符生涯中,每天都会遇到各种nu...

14020
来自专栏好好学java的技术栈

轻松看懂java设计模式简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

18920
来自专栏Python入门

十五道Python小案例,学会这些,Python基础已过关!

分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。

58240
来自专栏阿凯的Excel

Python读书笔记23(浅谈为什么要用类)

题外话:好几个朋友和我提出最好能写一个Python入门的合集版,我会尽快将基础知识分享完,然后重新整理一下过去分享的所有材料。 如果只是想学P...

40370
来自专栏Python数据科学

如何用Python递归地思考问题?

递归是一个很经典的算法,在实际中应用广泛,也是面试中常常会提到的问题。本文就递归算法介绍如何在Python中实现递归的思想,以及递归在Python中使用时的一些...

85960
来自专栏C语言及其他语言

[每日一题]大、小写问题

题目描述 输入一串字符,将其中的大写变成小写,若不为大写则原样输出 输入 任意字符串(长度在100以内)以回车表示输入结束 输出 将其中的大写 输出相应的小写,...

30560
来自专栏ACM算法日常

最高的牛Tallest Cow(前缀和)- POJ 3263

FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. E...

12610
来自专栏take time, save time

你所能用到的数据结构(八)

十一、不能被应用的理论不是好研究 前面介绍了堆栈的一些小小的理论模型,那么这样一个东西有什么作用呢?实际中不可能有那么一辆停在站台前方堵死的火车的,即使有,也...

28540
来自专栏java学习

Java每日一题_关于类继承常见的易错面试题

子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。 而父类没有无参的构造函数,...

13920

扫码关注云+社区

领取腾讯云代金券