Java线程学习整理--2---加入另一个线程join

1、join简介:

    今天刚学的,这里我简单总结一下,join本身就是“加入”的意思,那么在线程中是什么意思呢?是在一个线程的run方法执行过程中,当特殊情况下需要执行一些其他的操作的时候,我们会用到join这个方法。

    假设:

      在执行A线程的时候,在A的run方法中,创建 了一个新的线程B,并且启动了,那么接下来分为2种情况:

      (1):B没有调用join方法:

              这个时候A线程和B线程其实是处于同一个级别状态的,A、B线程可以说是竞争关系,共同争夺CPU的使用权限。

          不存在那个一定在前执行,那个一定在后执行的概念!

      (2):B调用了join方法:

              这个时候,情况就和(1)不一样了!

              此时:在A的run方法中,代码块执行到B创建并执行的时候,A线程就会暂时地停止,让出CPU的使用权限,这个时候

          B线程就开始执行操作了,当B线程控制的操作执行结束之后,A线程从被停止的操作处,继续开始执行接下来的任务!

2、简单举例说明:

 1 package cn.sxt.joins;
 2 /**
 3  * 加入线程:join
 4  *
 5  * 模拟:妈妈做饭是让儿子去买酱油
 6  * @author 小风微灵
 7  *
 8  */
 9
10
11 class M extends Thread{
12
13     public void run() {
14         System.err.println("中午啦!到饭点喽!");
15         System.out.println("妈妈准备--做饭。");
16         System.out.println("妈妈准备--洗菜。");
17         System.out.println("妈妈准备--切菜。");
18         System.out.println("妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!");
19
20         S s=new S();
21         s.start();
22         try {
23             /**分析说明:
24              * 必须在启动子辅助线程的之后再调用join方法才会起到效果!
25              *
26              * join()效果:
27              *         当前线程执行过程中,临时加入一个辅助线程,那么此时,当前线程暂停,
28              *     待辅助线程执行结束之后,在继续执行当前线程!
29              */
30             s.join();                //儿子买酱油加入到妈妈做菜的线程中去
31         } catch (InterruptedException e) {
32             e.printStackTrace();
33         }
34
35         System.out.println("妈妈开始炒菜。");
36         System.out.println("饭做好了,一家人一起吃饭。");
37
38     }
39 }
40
41 class S extends Thread{
42     public void run() {
43         System.out.println("儿子出门下楼。");
44
45         try {
46             Thread.sleep(1000);
47         } catch (InterruptedException e) {
48             e.printStackTrace();
49         }
50
51         System.out.println("儿子到达超,买到酱油!。");
52         System.out.println("儿子回家上楼。");
53
54         try {
55             Thread.sleep(1000);
56         } catch (InterruptedException e) {
57             e.printStackTrace();
58         }
59
60         System.out.println("儿子把酱油交给妈妈。");
61     }
62 }
63
64 public class JoinThread {
65
66     /**
67      * 启动程序
68      * @param args
69      */
70     public static void main(String[] args) {
71
72         new M().start();
73     }
74
75 }

运行结果:

中午啦!到饭点喽!
妈妈准备--做饭。
妈妈准备--洗菜。
妈妈准备--切菜。
妈妈准备--炒菜,发现没有酱油,让儿子去买酱油!
儿子出门下楼。
儿子到达超,买到酱油!。
儿子回家上楼。

时间: 2024-12-24 17:58:01

Java线程学习整理--2---加入另一个线程join的相关文章

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

Java并发学习之二——获取和设置线程信息

本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息能够帮助我们辨别每一个线程,知道它的一些信息 ID:每个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级. Status:线程状态.在java中,线程只有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 现在写一个程序,将线程的信息保存到文件中方便查看 pa

C#线程学习整理

1.线程的基本知识 (1)线程有时被称为轻量级进程,是程序执行流的最小单元. (2)线程是由线程ID,当前指令指针(PC),寄存器集合和堆栈组成. (3)线程自身不能拥有系统资源,但是可以使用线程所属进程所占有的系统资源. (4)线程可以创建和撤销另一个线程. (5)线程可以拥有自身的状态,例如 运行状态,挂起状态,销毁释放状态等等. (6)线程具有优先级,每个线程都分配了0-31级别

Java线程学习整理--4---一个简单的生产者、消费者模型

 1.简单的小例子: 下面这个例子主要观察的是: 一个对象的wait()和notify()使用情况! 当一个对象调用了wait(),那么当前掌握该对象锁标记的线程,就会让出CPU的使用权,转而进入该对象的等待池中等待唤醒,这里说明一下,每一个对象都有一个独立的等待池和锁池! 等待池:上述的wait()后的线程会进入等待池中,处于下图线程声明周期(简单示意图) 中的这个状态,等待池中的线程任然具有对象的锁标记,但是处于休眠状态,不是可运行状态! 当该对象调用notify方法之后,就会在等待池中系统

Java线程学习整理--3--简单的死锁例子

1.线程死锁的概念: 简单地理解下吧! 我们都知道,线程在执行的过程中是占着CPU的资源的,当多个线程都需要一个被锁住的条件才能结束的时候,死锁就产生了! 还有一个经典的死锁现象: 经典的“哲学家就餐问题”,5个哲学家吃中餐,坐在圆卓子旁.每人有5根筷子(不是5双),每两个人中间放一根,哲学家时而思考,时而进餐. 每个人都需要一双筷子才能吃到东西,吃完后将筷子放回原处继续思考,如果每个人都立刻抓住自己左边的筷子,然后等待右边的筷子空出来,同时又不 放下已经拿到的筷子,这样每个人都无法得到1双筷子

Java线程学习整理--1--守护线程

1.什么是守护线程? 今天老师讲解我才知道有守护线程这回事!原来守护线程经常存在于我们的身边,比如:一个免费的网页游戏,里面都会或多或少有些插入性的广告!! 一般情况下,我们不会去点击这些广告的,但是广告商是需要点击量的啊!所以制作游戏的人会背地里使用守护线程去访问这个广告界面,但是我们用户是不知道 的!就是守护线程一般对用户不可见,对背后的程序员可见! 再比如:我们使用的QQ软件,我们可以一边聊天,一边更新QQ软件!当我们聊天结束,关闭QQ的时候,你会发现,QQ更新的操作也被终止了! 其实:更

java核心学习(二十一) 多线程---创建启动线程的三种方式

本节开始java多线程编程的学习,对于操作系统.进程.线程的基本概念不再赘述,只是了解java对于多线程编程的支持有哪些. 一.继承Thread类来创建线程 java语言中使用Thread类来代表线程,代表线程的类可以通过继承Thread类并重写run()方法来实现多线程开发,调用线程类实例的start方法来启动该线程.下面来试一试 package ThreadTest; public class FirstThread extends Thread{ private int i; public

java多线程之:创建开启一个线程的开销

---->关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的话耗时不好说.---->关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当让这个可以通过设置-Xss属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了.--->对操作系统来说,创建一个线

初次学习多线程——自己写的一个线程池

1 package com.lovo.threadpool; 2 3 public class ThreadOfPool extends Thread{ 4 private Runnable task = null; 5 private ThreadPool threadPool; 6 private boolean stop = false;//线程状态 7 public ThreadOfPool() { 8 } 9 public ThreadOfPool(ThreadPool threadP