创建Java线程原来这么简单?!通俗易懂!阿里工程师用实例教你创建Java线程

2017年阿里巴巴Java开发工程师面试总结 前言从7月3号开始第一轮面试持续到刚才发现已回绝,整整一个月有余,之前一直不敢开面经,因为这个博客在简历中写过,面试官是可以看到我的博客的,所有我也不敢透露太多,最后的一个回绝整整距离第四面隔了16天才在面试官网进程中看到,一阵恍惚之后清醒过来,真是有点佩服阿里的效率了,这段时间很漫长,收获也很多,现在终于可以不用提心吊胆好好静下来谢谢自己的文字了。流程通过朋友内推拿到阿里的提前批面试,刚发送简历, 阅读详情

在这里插入图片描述

创建Java线程原来这么简单?!通俗易懂!阿里工程师用实例教你创建Java线程!

Java线程的创建

Thread类

  • 自定义线程继承类Thread类
  • 重写run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程

注意:线程不一定立即执行,CPU安排调度

package com.cnblogs.thread;

//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
public class TestThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("看代码中。。。");
        }
    }
/*
线程开启不一定立即执行,由cpu调度执行
 */
    public static void main(String[] args) {
        //创建一个线程对象
        TestThread testThread1 = new TestThread();
        testThread1.start();
//两个线程交替执行
        for (int i = 0; i < 1000; i++) {
            System.out.println("俺在学习多线程!!!");
        }
    }
}

Runnable接口

  • 定义MyRunnable类实现Runnable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程

推荐使用Runnable对象,因为Java单继承的局限性

package com.cnblogs.thread;
//创建线程方式二:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("看代码中。。。");
        }
    }

    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TestThread3 testThread3 = new TestThread3();
        //创建线程对象,通过线程对象来开启我们的线程,代理
//        Thread thread = new Thread();
//        thread.start();

        //简写
        new Thread(testThread3).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("俺在学习多线程!!!");
        }
    }
}

小结

  • 继承Thread类

    • 子类继承Thread类具备多线程能力
    • 启动线程:子类对象.start()
    • 不建议使用:避免OOP单继承局限性
  • 继承Runnable接口

    • 实现接口Runnable具有多线程能力
    • 启动线程:传入目标对象+Thread对象.start()
    • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

案例1:龟兔赛跑

  1. 首先来个赛道距离,然后要离终点越来越近
  2. 判断比赛是否结束
  3. 打印出胜利者
  4. 龟兔赛跑开始
  5. 故事中是乌龟赢得,兔子需要睡觉,我们需要模拟兔子随机
  6. 终于,乌龟赢得比赛
package com.cnblogs.thread;

//模拟龟兔赛跑
public class Race implements Runnable{

    private static String winner;
    加入Java开发交流君样:484138291一起吹水聊天
    @Override
    public void run() {

        for (int i = 0; i <= 1000; i++) {
            //给兔子加延时,模拟睡觉
            if(Thread.currentThread().getName().equals("兔子") && i % 10 == 0){
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            boolean flag = gameOver(i);
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName() + "跑了" + i + "步!");
        }
    }

    private boolean gameOver(int step){
        if(winner != null){
            return true;
        }else{
            if(step >= 1000){
                winner = Thread.currentThread().getName();
                System.out.println("winner is " + winner);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"乌龟").start();
        new Thread(race,"兔子").start();
    }
}

案例2:下载网图(需要导入commons包)

package com.cnblogs.thread;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/*
练习Thread 实现多线程同步下载图片
 */
public class TestThread2 extends Thread{

    private String url;//网络图片地址
    private String name;//保存的文件名

    public TestThread2(String url , String name){
        this.url = url;
        this.name = name;
    }

    @Override
    public void run() {
        WebDownLoader webDownLoader = new WebDownLoader();
        webDownLoader.downloader(url,name);
        System.out.println("下载了文件名为:" + name + "的文件");
    }加入Java开发交流君样:484138291一起吹水聊天


    public static void main(String[] args) {
        TestThread2 t1 = new TestThread2("https://img-blog.csdnimg.cn/2021051913555284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg4NDIzNA==,size_16,color_FFFFFF,t_70","1.jpg");
        TestThread2 t2 = new TestThread2("https://img-blog.csdnimg.cn/20210519135426133.png","2.jpg");
        TestThread2 t3 = new TestThread2("https://img-blog.csdnimg.cn/20210519135102589.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg4NDIzNA==,size_16,color_FFFFFF,t_70","3.jpg");

        t1.start();
        t2.start();
        t3.start();
        /*
        下载了文件名为:2.jpg的文件
        下载了文件名为:3.jpg的文件
        下载了文件名为:1.jpg的文件
         */
    }
}

class WebDownLoader{
    public void downloader(String url , String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            System.out.println("IO异常,downloader方法出现问题!");
            e.printStackTrace();
        }
    }
}

线程池创建线程

ExecutorService:用来存储线程的池子,把新建线程/启动线程/关闭线程的任务都交给池来管理

  • execute(Runnable任务对象) 把任务丢到线程池

Executors 辅助创建线程池的工具类

  • newFixedThreadPool(int nThreads) 最多n个线程的线程池
  • newCachedThreadPool() 足够多的线程,使任务不必等待
  • newSingleThreadExecutor() 只有一个线程的线程池
package com.cnblogs;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestRunnable {

    public static void main(String[] args) {
        MyRunnable target = new MyRunnable();
        //创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 5; i++) {
            pool.execute(target);
        }

    }
}

class MyRunnable implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("多线程哦!!" + Thread.currentThread().getName());
        }
    }
}

标签: [ava 线程j]

最新2021整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:484138291

阿里-测试工程师面试题目记录 阿里面试题目记录2018-10-09 题目一:linux如何实现凌晨定时执行脚本? Linux中,周期执行的任务一般由cron这个守护进程来处理。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。 题目二:java如何实现多线程?线程的状态有哪些? java实现多线程有两种方法     1、继承T... 阅读详情

相关推荐

我的后端Java面经、八面阿里,已拿offer!(阿里飞猪、阿里健康、阿里菜鸟)心得感悟!

阿里巴巴面试 自我介绍 讲一个项目,我说的区块链,然后围绕着区块链说了一堆,比如说我没回答上来的,有没有做性能测试,还有orderer节点都有什么服务 最大堆概念 排序算法比较排序时间复杂度,如何查找最大的1000个数 有没有什么排序算法能够小于nlogn的 阿里巴巴菜鸟网络面试 面试岗位 菜鸟网络的JAVA开发岗 面试体验 工作内容为Java后台的业务开发,还有一部分C++工作,聊了大概1个...

Java____superman的博客 5112

Java创建线程的5种方式(附代码示例)

在Java中,线程(Thread)是程序执行的最小单元,它允许程序在同一时间执行多个任务。Java中的线程可以由Thread类创建,也可以通过实现Runnable接口或Callable接口创建。

qq_45110186的博客 6586

阿里最新Java研发工程师面试经验(社招)

前言 今天要和大家一起分享的是一位面试菜鸟网络的Java研发工程师的面试经验,他通过了前三次电话面试,但是在第四次现场面试中没有能够成功通过,最终遗憾地与菜鸟的Offer说再见。但是正如这位同学自己说的“面试道路上最大的收获就是我要搞明白我是怎么失败的”,这件事情很重要,也希望大家能够从他的经历中吸取经验和教训。 一面 面试官还是比较温柔的,上来先让我做了自我介绍,我简单介绍了一下...

qq_39662660的博客 2405

Java 中创建线程的几种方式

Java 中创建线程的几种方式

Java徐师兄的博客 3018

阿里面试经历JAVA总结——JAVA研发工程师

为记录阿里的电面经历,特与大家分享,岗位是JAVA研发工程师。 一面主要问题如下: 1)首先自我介绍 2)数据结构算法的基本问题,如排序算法,二叉树遍历,后序遍历非递归,图的最短路径问题 3)对一个数组进行绝对值排序的算法 4)java中hashmap的底层实现 5)java中垃圾回收机制GC原理等 6)介绍自己的项目,数据库中用到的数据结构数据模型,死锁的概念(问的应该是数据库的死锁),如何避免死锁? 7)乐观锁和悲观锁? 8)一致性hash算法 9)项目中业务对象的关联关系/关联方式

马小婧QAQ 732

阿里巴巴Java工程师:怎么才算掌握了JDK中的线程池?

JDK并发包下面的线程池是面试中经常被考查的点今天,我来谈谈自己觉得ThreadPoolExecutor哪些点是应该掌握的,这些点应该掌握的点正是面试中经常被问的东西。现在抛出几个问题,如果你都能答上来,可以不用往下面看啦。如果回答的上就pass吧,哈哈简单介绍一下,一个任务提交给线程池后,线程池创建线程来执行提交任务的流程。 1、当提交任务时线程池中的来用执行任务的线程数小于corePoolSize(核心线程数),则线程池利用ThreadFacory(线程工厂)创建线程用于执行提交的任务。否则执行第二2步

m0_71777195的博客 238

Java创建线程的几种方式

在Java中,线程是一种轻量级的执行单元,可以同时执行多个任务。创建线程是Java多线程编程的基本操作之一,本文介绍了Java中创建线程的几种方式,包括继承Thread类、实现Runnable接口、使用Callable和Future、以及使用线程池。通过示例代码和测试用例展示了每种方式的使用方法和原理解释。

王德昌的博客 1042

创建线程并启动-创建线程的前三种方式

本文主要介绍了创建线程并启动-创建线程的前三种方式,希望能对学习线程的同学有所帮助。 文章目录 1. 创建线程并启动 2. 方式一:继承Thread类 3. 方式二:实现Runnable接口 4. 方式三:实现Callable接口

weixin_43178406的博客 1028

Java创建线程实例详解

2.创建Callable实现类的实例对象,并使用Future的实现类FutureTask类包装Callable实例对象。1.定义实现类实现Runnable接口,并实现run方法,run方法中的逻辑即为该线程的具体逻辑。使用继承Thread的方式创建线程,缺点就是因为java的单继承机制,使得该类无法再继承其他类。因为创建线程是一个比较重的操作,使用线程池可以减少线程创建销毁等的性能开销。直接继承Thread类的方式,实现简单方便,但是因为单继承问题,无法再继承其他类。run方法中是后返回类型的。...

bitcarmanlee的博客 824

Java建立一个单线程的实例.rar

Java建立一个单线程的实例,比较基础的Java线程创建例子,希望新手好好参考。

ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)解决办法

问题:ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 很久没用这台电脑的mysql了,今天需要连接数据库,启动数据库报错: ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 解决方法: 查阅资料后知道了,应该使用已知的用户名和密码登陆 mysql -u root -p 然而密

一个超会写Bug的程序猿的博客 43万+

你知道阿里巴巴java代码规范中关于创建线程池scheduledThreadPool的错误在哪里吗

scheduledThreadPool 的最大线程数没有发挥作用。 从创建可调度线程的源码看最大线程数数为什么没有发挥作用。

唐欢 1098

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5中间件的完整流程,包括环境准备、依赖调整、Web.xml版本适配、部署配置优化及常见问题解决方案。特别针对信创改造需求,提供了排除Tomcat依赖、处理BES专用starter等实用技巧,帮助开发者顺利完成国产中间件迁移。

weixin_30825581的博客 1104

Java工程师核心书单,阿里大佬看了都说好!

Java核心书单,优中选优。

三分恶的博客 7804

wsl2 配置ubuntu 固定ip

wsls ubuntu 设置固定ip

musk1212的博客 2621

Python量化投资——mplfinance实现全功能动态交互式K线图(蜡烛图)【源码+详解】

特别鸣谢:@szFoxtech 同学热心提供了通过键盘操作平移和缩放K线图的代码!!在我的另一篇文章《七行代码利用tushare和mplfinance生成K线图》中,我介绍了两个非常好用的python库,结合起来可以非常方便容易地生成股票的K线图,对于使用python进行量化投资研究的朋友可谓是必备良方。如下图所示,仅仅几行代码,就能生成下面这张K线图:不过,仅仅使用七行代码生成的K线图,虽然看上去也像那么回事了,但是对于真正需要使用K线图作为研究工具或者可视化工具的朋友们来说,是远远不够的。在我看来,至少

m0_67390379的博客 9839

阿里巴巴java研发工程师面试经历分享

本人近期经历了阿里巴巴的面试,也接触了不同的面试官,说实话不同的面试官的面试风格是很不相同的,接下来就把自己在面试中被问到的题目描述一下: 首先,一面。经过多次面试后总结到所有的面试开头都会让你进行一个简单的自我介绍。我认为这个自我介绍大家一定要精心准备一下,在自我介绍的过程中要向面试官讲明自己的优势,引导面试官去问一些你认为自己掌握的比较好的东西。一面中面试官首先问了一下我的项目相关的东西,首

isssen的专栏 3161

简单快速理解知识图谱(1)

什么是知识? 百度:知识是符合文明方向的,人类对物质世界以及精神世界探索的结果总和。 通常我们认为的知识,是我们在实践中对于认识客观世界的成果,其中包括诸多,如事实、信息描述、实践技能、归纳总结的客观规律,发现论证的推导。知识也可以看成是构成人类智慧的最根本因素。但是这是全人类知识的概述,不同于个人理解的知识,不同于知识图谱中的知识,也就是本文中所阐述的“知识”是狭义上的知识。因为知识是狭义的,所...

Laic Zhang的博客 3009

java 中创建线程有哪几种方式?

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取。

2401_83641098的博客 811

Allegro如何去掉PCB内层未使用的过孔孔环?

在用Allegro进行PCB设计过程中,遇到铺铜铜箔被焊盘大量割断,导致铺铜不完整,这样就会导致铺铜过电流太小,影响板的性能,严重的会导致板工作不稳定,甚至不工作。解决办法:是去掉内层未使用的过孔孔环,增大过铜箔面积。

bhxc809751502的博客 2575

【8】mctp & pldm

异步会check seq,保证不丢包,虽然发一条req,不用等,但是不能发下一条req,等上条response回来后才能发下一条。TO(tag owner)=1是request,TO=0是response,但是异步通信response由0改为1。如下还有kcs,i3c,serial等。

持续更新ing... 1084

Java线程 (使用Callable实现多线程),看完你发现多线程多么简单!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】世界上只有一种真正的英雄主义就是在认清生活真相之后仍然热爱它。

qq_58071132的博客 915

MALTAB程序利用质心法去寻峰

质心法的优点是简单易实现且计算速度快,适用于数据点较少或峰值较明显的情况。然而,对于复杂的数据或多峰曲线,质心法可能无法准确识别所有峰值,因此在这些情况下可能需要使用更复杂的峰值检测算法。质心法(Centroid Method)是一种寻找峰值的方法,其基本原理是通过计算数据窗口内的质心位置来确定峰值的位置。质心是指在一维数据中,按照数据的幅值对位置进行加权平均的结果,即质心位置为数据幅值加权平均值的位置。变量定义了计算质心的窗口大小。最后,绘制了找到的峰值位置和幅值点,并显示了找到的峰值位置和幅值的结果。

走向CTO的路上... 1351

阿里巴巴Java开发工程师第一轮面试8个问题,你知道几个?

之前w3cschool发布了一篇“阿里巴巴前端程序员第一轮面试问题”的文章,有些java开发者看着标题也点进来阅读了。是的,就是这么一部分可爱java程序员网友表示,走错会场了,一题也不会!不过,今天w3cschool这里就特意分享阿里巴巴Java开发工程师第一轮面经,这次担保大部分题目你可以对答如流。废话不多说,先放出一波论坛网友分享的阿里巴巴java第一轮面试题目先:本来以为有自我介绍,但是并...

luohegan1617的博客 5371

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

java开发转算法工程师,统统给你解决!

四面阿里 面试岗位是研发工程师,直接找蚂蚁金服的大佬进行内推,参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 一面: 自我介绍 项目中做了什么,难点呢。 Java的线程池说一下,各个参数的作用,如何进行的。 Redis讲一下 分布式系统的全局id如何实现。用zookeeper如何实现的呢,机器号+时间戳即可。 分布式锁的方案,redis和zookeeper那个好,如果是集群部署,高并发情况下哪个性能更好。 kafka了解么,了解哪些消息队列。 想做业务还是研究。 然后出了

m0_57066056的博客 1383

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 是时候检验真正的技术了!看完教你真正搞懂Java注解和反射!
下一篇: 妈妈再也不用担心我的学习了!看完教你一招教你吃透数据结构链表!
Danny_java
博客等级 码龄5年 9粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值