爸爸和儿子的故事带你理解java线程

今天回想线程方面的知识,发现一个非常有意思的小程序。是用来说明多线程的以下贴出来分享下,对刚開始学习的人理解线程有非常大的帮助

爸爸和儿子的故事

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class FatherThread extends Thread{  

    @Override
    public void run() {
        System.out.println("爸爸想抽烟。发现烟抽完了");
        System.out.println("爸爸让儿子去买包红塔山");
        Thread son = new SonThread();
        son.start();
        System.out.println("爸爸等儿子买烟回来");
        try {
            //join含义:等待son线程运行完成,father线程才继续运行
            son.join();
            }
        catch (InterruptedException e) {
            System.out.println("爸爸出门去找儿子跑哪去了");
            System.exit(1);
        }
            System.out.println("爸爸高兴的接过烟開始抽,并把零钱给了儿子");  

    }  

}  </span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class SonThread extends Thread{  

    @Override
    public void run() {
        String tags ="\t\t\t\t\t";
        System.out.println(tags+"儿子去买烟了");
        System.out.println(tags+"儿子去买烟要10分钟");
        try {
            for(int i =0; i<10;){
                Thread.sleep(1000);
                System.out.println(tags+"儿子出去第"+ ++i +"分钟");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();  

        }
        System.out.println(tags+"儿子去买烟回来了");
    }  

}  </span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class Main {
    public static void main(String[] args){
        System.out.println("爸爸和儿子的故事");
        Thread faThread =new FatherThread();
        faThread.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}  </span>

执行结果

爸爸和儿子的故事

爸爸想抽烟,发现烟抽完了

爸爸让儿子去买包红塔山

爸爸等儿子买烟回来

儿子去买烟了

儿子去买烟要10分钟

儿子出去第1分钟

儿子出去第2分钟

儿子出去第3分钟

儿子出去第4分钟

儿子出去第5分钟

儿子出去第6分钟

儿子出去第7分钟

儿子出去第8分钟

儿子出去第9分钟

儿子出去第10分钟

儿子去买烟回来了

爸爸高兴的接过烟開始抽,并把零钱给了儿子

程序进入主函数,首先father线程開始运行。爸爸让儿子去买烟,然后等待儿子买烟回来。这时son线程启动10分钟后儿子回来fathrer线程继续运行。

时间: 2024-11-08 06:19:00

爸爸和儿子的故事带你理解java线程的相关文章

一个故事带你理解if __name__ == &#39;__main__&#39;

如果你刚刚接触python,相信会在看别人的程序的时候会遇到if __name__ == '__main__'酱紫的语法,如果当时没看懂现在也一知半解的话,看下去,本文可以帮你解决这个问题. 大家都知道:Python的一大优点就是里面的模块非常多--包括内置的模块与自定义模块.我们可以直接利用别人写好的模块去实现自己的需求,酱紫大大的提高了自己的开发效率.也就是说,有时候你可能只需要一些文献阅读的能力与基本的编码能力也可以实现很强大的功能!~~这也许就是Python在各行各业各处开花的原因吧/叹

深入理解 Java 线程池

目录   一.简介  二.Executor 框架  三.ThreadPoolExecutor  四.Executors  参考资料 一.简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建和销毁线程.如此一来,会大大降低系统的效率,可能频繁创建和销毁线程的时间.资源开销要大于实际工作的所需. 正是由于这个问题,所以有必要引入线程池.使用 线程池的好处 有

一篇故事带你理解渠道、经销、分销、代理等概念

背景 最近在做需求调研的过程中,接触到了很多业务层面上的概念和术语.生硬的搬运概念很难做到举一反三,最近看到了一前辈通过小故事把几个相关联的几个概念解释的很清晰和直白,我特此借鉴过来,自己重新拟了一个小故事,特此记录. 故事 小路是一个在陕北山沟沟里面长大的农村娃.二十岁的那年,他们那里没有下过一滴雨,庄家严重歉收,村子里很多人都跑到外面奔生计去了.听说李大婶说,他家毛二跑到了隔壁的河东省蹬三轮了,说那边经济好挣钱容易,小路听闻后便搭上了火车投奔毛二了. 到了那边后,先是效仿毛二买了一辆二手破三

1分钟带你理解Java Web开发必掌握的:Token ,Cookie,Session

在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式.Cookie存储的数据量有限,且都是保存在客户端浏览器中.不同的浏览器有不同的存储大小,但一般不超过4KB.因此使用Cookie实际上只能存储一小段的文本信息. 例如:登录网站,今输入用户名密码登录了,第二天再

Callable、FutureTask和Future详解带你理解java并发编程

一. Callable接口与Runnable接口区别 创建java线程,我们经常使用两种方式: 一是直接继承Thread 另一种是实现Runnable接口 但这两种方式有一个缺陷:在执行完任务之后无法直接获取执行结果. 1. 接口定义 1.1 Callable接口 public interface Callable<V> { V call() throws Exception; } 1.2 Runnable接口 public interface Runnable { public abstra

深入理解Java线程池

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实

07深入理解Java线程池

之前面试baba系时遇到一个相对简单的多线程编程题,即"3个线程循环输出ADC",自己答的并不是很好,深感内疚,决定更加仔细的学习<并发编程的艺术>一书,到达掌握的强度.(之前两月休息时间都花在了lol和吃鸡上,算是劳逸结合了,推荐大家代码写累了可以玩下吃鸡,是个不错的调剂) 流程分析 Java的线程池是最常用的并发框架,合理的使用线程池可以降低系统消耗.提高响应速度.提高线程的可管理性.线程池的基础处理流程如下图所示. 上图中标红的4处正好是构建线程池的核心,核心线程池大

深入理解java线程池—ThreadPoolExecutor

几句闲扯:首先,我想说java的线程池真的是很绕,以前一直都感觉新建几个线程一直不退出到底是怎么实现的,也就有了后来学习ThreadPoolExecutor源码.学习源码的过程中,最恶心的其实就是几种状态的转换了,这也是ThreadPoolExecutor的核心.花了将近小一周才大致的弄明白ThreadPoolExecutor的机制,遂记录下来. 线程池有多重要##### 线程是一个程序员一定会涉及到的一个概念,但是线程的创建和切换都是代价比较大的.所以,我们有没有一个好的方案能做到线程的复用呢

由浅入深理解Java线程池及线程池的如何使用

前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory.即便没有这样的情况,大量的线程回收也会给GC带来很大的压力. 为了避免重复的创建线程,线程池的出现可以让线程进行复用.通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用. 接下来从总体到细致的方式,来共同探讨线程池. 总体的架构