1.继承Thread类重写run方法

/*** @author 守鹤* @date 2020/5/24 16:28*/
public class ByExtendThread  extends  Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+"正在执行--->"+i);}}public static void main(String[] args) {ByExtendThread thread1 = new ByExtendThread();ByExtendThread thread2 = new ByExtendThread();thread1.setName("子线程1");thread2.setName("子线程2");thread1.start();thread2.start();}
}

1.1.网图下载小案例

  • 导入Common-io 依赖
   <dependencies><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency></dependencies>
/*** @author 守鹤* @date 2020/5/24 16:01*/
public class ThreadDownLoad extends Thread {//网络资源地址private String url;//下载之后的名字private String name;public ThreadDownLoad(String url, String name) {this.url = url;this.name = name;}@Overridepublic void run() {try {FileUtils.copyURLToFile(new URL(url),new File(name));System.out.println(name+"图片下载成功");} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {ThreadDownLoad load1 = new ThreadDownLoad("https://i0.hdslb.com/bfs/space/265ecddc52d74e624dc38cf0cff13317085aedf7.png@2200w_400h_1o.webp","1.jpg");ThreadDownLoad load2= new ThreadDownLoad("https://i0.hdslb.com/bfs/space/265ecddc52d74e624dc38cf0cff13317085aedf7.png@2200w_400h_1o.webp","2.jpg");ThreadDownLoad load3 = new ThreadDownLoad("https://i0.hdslb.com/bfs/space/265ecddc52d74e624dc38cf0cff13317085aedf7.png@2200w_400h_1o.webp","3.jpg");load1.start();load2.start();load3.start();}
}

图片下载成功,但是可以看到不是顺序下载的

2.实现Runable接口,重写run方法

/*** @author 守鹤* @date 2020/5/24 16:49*/
public class ByImplRunable implements Runnable {private Integer tickets=10;public void run() {while (true){if(tickets>0){System.out.println(Thread.currentThread().getName()+"正在买第"+tickets--+"张票");}else{break;}}}public static void main(String[] args) {ByImplRunable run1 = new ByImplRunable();new Thread(run1,"守鹤").start();new Thread(run1,"死歌").start();new Thread(run1,"青鸟").start();}
}

2.1.龟兔赛跑小案例

/*** @author 守鹤* @date 2020/5/24 17:04*/
public class RabbitRace implements Runnable {private String winner;public void run() {for (int i = 1; i <= 100; i++) {System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");if(gameOver(i)){break;}}}public boolean gameOver(Integer step){if(winner!=null){return true;}if(step==100){winner=Thread.currentThread().getName();System.out.println(winner+"是获胜者");return true;}return false;}public static void main(String[] args) {RabbitRace race = new RabbitRace();new Thread(race,"兔子").start();new Thread(race,"乌龟").start();}
}

3.实现Callable接口,重写call方法

package com.shouhe.demo;import java.util.concurrent.*;/*** @author 守鹤* @date 2020/5/24 17:29*/
public class ByImplCallable implements Callable<Boolean> {public Boolean call() throws Exception {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+"--->"+i);}return true;}public static void main(String[] args) {ByImplCallable c1= new ByImplCallable();ByImplCallable c2 = new ByImplCallable();ByImplCallable c3 = new ByImplCallable();ExecutorService service = Executors.newFixedThreadPool(3);Future<Boolean> sub1 = service.submit(c1);Future<Boolean> sub2 = service.submit(c2);Future<Boolean> sub3 = service.submit(c3);try {Boolean b1 = sub1.get();Boolean b2 = sub2.get();Boolean b3 = sub3.get();System.out.println(b1);System.out.println(b2);System.out.println(b3);service.shutdown();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}

Thread--线程创建的三种方式相关推荐

  1. 一心多用多线程-线程创建的三种方式

    第一次了解java线程机制,记录一下线程启动的三种方式. 1.通过继承Thread类调用一个线程 public class Thread1 extends Thread{@Overridepublic ...

  2. 线程生命周期以及线程创建的三种方式

    1. 线程生命周期 线程生命周期图 新建状态(New) 当线程对象创建后,即进入新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable) 当调用线程对象的sta ...

  3. 创建线程的第三种方式---JDK8新特性

    创建线程的第三种方式-JDK8新特性 实现Callable接口,创建线程 Runnable和Callable接口的不同 1.Callable可以返回一个类型V,而Runnable不可以,也就是说Cal ...

  4. 创建线程的第三种方式:实现Callable接口(含部分源码解析)

    创建线程的第三种方式--实现Callable接口 package com.lqy.Multithreading; import java.util.concurrent.Callable; impor ...

  5. JUC-多线程(5.获得线程的第三种方式)学习笔记

    文章目录 获得线程的第三种方式 : Callable接口 1. 前言 1. 获得多线程的方法几种? 2. 以下两种获得线程的方式的异同 2. 使用 1. 重写 call 方法 2.创建线程 3.获取返 ...

  6. java实现线程安全的三种方式

    前言 一个程序在运行起来的时候会转换成进程,通常含有多个线程.通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如现实生活中,银行取钱问题. ...

  7. java多线程学习一、线程介绍、线程创建的3种方式、lambda创建方式、线程状态、线程示例:12306买票和银行取钱

    文章目录 前言 一.线程简介 1.概述 2.进程.线程 区别 在这里插入图片描述 3. 核心概念 二. 线程创建 1.概述 2. 第一种方式继承Thread 1) 继承Thread 2) 示例:下载图 ...

  8. 进程线程004 Windows线程切换的三种方式

    文章目录 主动切换(调用API) KiSwapContext函数分析 哪些API调用了SwapContext函数 总结 时钟中断切换 如何中断一个正在执行的程序 系统时钟 时钟中断的执行流程 总结 时 ...

  9. Golang主线程让子线程退出的三种方式

    在golang中,主go程告知子go程退出有三种方式,建议用后面两种 方式一:全局变量方式 package mainimport ("fmt""sync"&qu ...

  10. Python 线程同步的三种方式

    我们使用多线程的目的通常是并发的运行单独的操作,但有时候也需要在两个或多个线程中同步操作.在Python中,线程同步有多种方式,包括Event.Condition和Barrier 方式一:Event ...

最新文章

  1. TinkerNode NB-IoT物联网开发板(NB-IoT专栏—拓展篇3)
  2. Ubuntu12.04下在Android4.0.4源码下载及其编译过程(转载)
  3. Python用urlib爬虫基础及格式入门
  4. python 合并区间
  5. 机器学习能诊断病情,还能预测患者出院后的情况?
  6. json对象转换成string的方法
  7. VM虚拟机链接克隆及linux eth0网卡的快速设置方法
  8. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  9. 为什么家里pm25比外面高_自己在外面花天酒地,不舍得为妻子花一分钱,这样男人有多可恨?...
  10. Redis-02-Redis数据类型与对不同类型数据的操作
  11. Jackson 格式化日期问题
  12. 加解密算法 之base64 原理
  13. win10+ubuntu16.04双系统下完全删除并重装ubuntu16.04
  14. Activiti7使用
  15. zoj 3332 Strange Country II
  16. 电子书CHM格式转换为PDF文件(转)
  17. JUL(java.util.logging)java原生官方日志 使用与配置--解决jul不输出显示日志问题
  18. Android自学笔记:Tab控件源码剖析
  19. 获取openwrt mac地址
  20. 科学计算机上的符号是什么意思,计算器上各个符号是什么意思_计算器各键说明【图文】-太平洋IT百科手机版...

热门文章

  1. Slave SQL thread retried transaction 10 time(s) in vain, giving up. Consider raising the value of t
  2. 给90后发了面试邀请,可他却因为“薪酬面议”拒绝了
  3. Windows系统如何部署Rabbit和启动Rabbit服务
  4. 仿JD商城UI布局达到90%——Android源码
  5. 阐述游戏AI设计的两个禁忌及解决方法
  6. HTML5之内联框架和音视频标签
  7. 小孩学计算机的电视剧,小时候在教育频道看的一个电视剧,好像是叮当演的,讲一堆小孩学唱戏之类的...
  8. 智能CDN(上):CDN的访问过程和加速原理
  9. 中国式父母计算机科学家攻略,中国式家长攻略大全:全结局解锁技巧汇总[多图]...
  10. 视频播放到一半就无法播放怎么修复?