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

嗯哈,像书本这个列子:

如: B.join();

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

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

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

 package dialog_color;

 public class Example12_8
{
public static void main(String args [])
{
ThreadJoin a = new ThreadJoin();
Thread customer = new Thread(a);
Thread cakeMaker = new Thread(a);
customer.setName("顾客");
cakeMaker.setName("蛋糕");
a.setJoinThread(cakeMaker);
customer.start();
}
}
class ThreadJoin implements Runnable
{
Cake cake;
Thread joinThread;
public void setJoinThread(Thread it)
{
this.joinThread=it;
}
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals("顾客"))
{
System.out.println(Thread.currentThread().getName()
+"等待"+joinThread.getName()+"制作生日蛋糕");
try {
joinThread.start();
joinThread.join(); } catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"买了"+cake.name+"价钱: "+cake.price);
}
else if(Thread.currentThread()==joinThread)
{
System.out.println(joinThread.getName()+"开始制作生日蛋糕,请等待......");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cake=new Cake("生日蛋糕",158);
System.out.println(joinThread.getName()+"制作完成!");
}
} class Cake //内部类 相当于一个结构体) (c/c++)
{
int price ;
String name;
Cake(String name ,int price)
{
this.name=name;
this.price=price;
}
}
}

效果图:

code:

 package tes;
/*
* 模拟这样一个过程
* 一个老头去买蛋糕,蛋糕需要先做,
* 老头等待做完,然后付款离开。
*
* */
public class Example12_9 { public static void main(String args [])
{
Thread aa,bb;
JoinThread hehe = new JoinThread();
aa = new Thread(hehe);
bb = new Thread(hehe);
aa.setName("老头");
bb.setName("蛋糕师傅");
hehe.setJoinThread(bb);
aa.start();
}
}
class JoinThread implements Runnable
{
Thread myThread;
cake mycake;
public void setJoinThread(Thread name) {
myThread=name;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals("老头"))
{
print(Thread.currentThread().getName()+"等待蛋糕师傅制作蛋糕"
+myThread.currentThread().getName()+"开始制作蛋糕.....");
//开始联合同步
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
print(myThread.currentThread().getName()+"蛋糕做完..."
+Thread.currentThread().getName()+"买了"+mycake.name
+" 价钱:"+mycake.price);
}
else if(Thread.currentThread()==myThread)
{
print(myThread.currentThread().getName()+
"开始制作蛋糕,wait for minutes !");
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
print("蛋糕做完了");
mycake = new cake("蛋糕",12.8);
}
}
private void print(String name){
System.out.println(name);
}
class cake
{
String name;
double price;
cake(String name,double price){
this.name=name;
this.price=price;
}
}
}

javaSE之线程联合的更多相关文章

  1. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

  2. java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级

    转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...

  3. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  4. 09 - JavaSE之线程

    线程 线程的基本概念 线程是一个程序里面不同的执行路径. 进程与线程的区别 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换开销大. 线程可以看作轻量级的进程,同一类线程共享代码和数据空间 ...

  5. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  6. 联合线程(案例顾客买蛋糕 :使用join()方法)

    运行效果图:

  7. Java 多线程详解(五)------线程的声明周期

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  8. Java 多线程(三)—— 线程的生命周期及方法

    这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待 ...

  9. 计算机网络通信、线程、tcp、udp通信及信号量等读书笔记

    一.计算机网络 1.什么是计算机网络:把分布在不同地理位置的计算机与专门的网络设备用通信线路互相连成一个规模大.功能强的系统,从而使众多计算机可以方便地互相传递信息.共享软件.硬件.数据信息等.简单来 ...

随机推荐

  1. Update与FixedUpdate区别

    以下的代码能使游戏暂停,记得要使速度*Time.deltaTime,目的是保证游戏运行在帧数不同的情况下,角色移动速度都一样,因为此时角色是按时间移动与帧数无关. using UnityEngine; ...

  2. DEV界面皮肤

    1.添加一个 2.添加引用: 3.添加一个SkinTools类 public class SkinTools { /// <summary> /// 在Program中调用 /// < ...

  3. Socket通信常用方法

    使用tcp协议,链接服务器的方法 /// <summary> /// 连接使用tcp协议的服务端 /// </summary> /// <param name=" ...

  4. CUBRID学习笔记 27 数据类型4

    范围比较 数字和字符串比较 字符串被转为double SELECT i FROM t WHERE i <= all {'11','12'}; i ============= 1 2 3 4 字符 ...

  5. STORM_0009_Lifecycle-of-a-topology/拓扑的生命周期

    http://storm.apache.org/releases/1.0.1/Lifecycle-of-a-topology.html STORM拓扑的生命周期   本页的内容基于0.7.1代码,后来 ...

  6. max(min)-device-width和max(min)-width的区别

    在网页自适应设计中,max-device-width和max-width是不可缺少的两大CSS属性,但是可能大家在使用的选择上没有太多讲究,认为用其中一个即可.确实,如果没有特定要求,用任何一个都没有 ...

  7. [poj2286]The Rotation Game (IDA*)

    //第一次在新博客里发文章好紧张怎么办 //MD巨神早已在一个小时前做完了 The Rotation Game Time Limit: 15000MS Memory Limit: 150000K To ...

  8. gitHub-初识

    如何生成github所使用的ssh key https://help.github.com/articles/generating-ssh-keys/ 多个github帐号的SSH key切换 htt ...

  9. c 函数调用产生的汇编指令和数据在内存情况(2)

    c 函数调用产生的汇编指令和数据在内存情况(1) 一直对函数调用的具体汇编指令和各种变量在内存的具体分配,一知半解.各种资料都很详细,但是不实践,不亲自查看下内存总不能笃定.那就自己做下. 两个目的: ...

  10. zend studio12.5破解方法

    其实,很简单,找到zend studio 安装目录,G:\zend studio\plugins,把文件com.zend.verifier_12.5.1.v20150514-2003.jar替换成压缩 ...