首先定义 : 一个线程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. c++ float 带 e 的指数

    带e是指10的 e后面次方 #include <iostream> int main() { float f; f = 9.87654321f; std::cout << f ...

  2. hdu 5950 Recursive sequence 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. 面向对象---prototype

    构造函数里的this,外面的new <script> //用工厂方式构造对象 function createPerson(name, sex) //构造函数 { //假想的系统内部工作流程 ...

  4. 利用tomcat配置网站

    1: 首先将tomcat考到C盘: 2:建立我们存放web应用的目录,我建立在D:\myWeb  ,然后将自己的web应用考到myWeb目录下: 3:wApp的目录结构为: WEB-INF: 结构: ...

  5. Linux添加新硬盘自动挂载硬盘

    Linux添加新硬盘自动挂载硬盘的具体步骤 1.插入新硬盘,启动Linux服务器,使用fdisk -l 查看硬盘 #fdisk -l Disk /dev/sdb: 1000.2 GB, 1000204 ...

  6. server-pc--------------->lspci,lsusb,meminfo等配置信息

    安装yum install pciutils usbutils [root@server09 ~]# [root@server09 ~]# lspci00:00.0 Host bridge: Inte ...

  7. Java编程思想学习笔记_1(Java内存和垃圾回收)

    1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...

  8. linux 试题

    1. 在Linux系统中,以 文件 方式访问设备 . 2. 某文件的权限为:drw-r--r--,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是 目录 . 3. 前台起动的进程使用 C ...

  9. LTIB常用命令2

    LTIB 编译配置选项 根据说明文档,ltib 可以通过以下的命令配置: * <verbatim># ./ltib</verbatim>          安装后第一次运行,采 ...

  10. hiho_1059_string matching content length

    题目大意 两个字符串strA和strB(长度最大为2100),他们中按照顺序有一些公共的子串,且公共子串的长度大于等于3,否则不认为是合法的,比如 abcdef 和 abcxcdef, 按照顺序有合法 ...