• Process与Thread(进程和线程)

程序是指令和数据的集合,是一个静态的概念。

进程则是执行程序的一次过程,是动态的概念,是系统资源分配的单位。

通常一个进程中可以包含若干个线程,一个进程中至少有一个线程,不然没有存在的意义,线程是CPU调度和执行的单位。

例如:一个视频是一个进程,那么其中有播放声音、显示画面、看弹幕等多个线程。(main()相当于主线程,其他的方法为其他的线程)

  • 创建线程

方式一:继承Thread类,重写run() ,调用start()开启线程

调用run()方法按顺序依次执行

package 多线程;
//继承Thread类,重写run,调用start开启线程
public class Create extends Thread{@Overridepublic void run() {//run方法线程体for(int i = 0;i<20;++i){System.out.println("我在看代码--" + i);}}public static void main(String[] args) {//主方法main线程,主线程//创建一个线程对象Create create = new Create();//调用run方法按顺序执行create.run();for (int i = 0; i < 20; i++) {System.out.println("我在学习多线程--" + i);}}
}
/*
结果为:
D:\Java\jdk\bin\java.exe "-javaagent:D:\java\IntelliJ IDEA Educational Edition 2020.1.1\lib\idea_rt.jar=64891:D:\java\IntelliJ IDEA Educational Edition 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\java\jdk\jre\lib\charsets.jar;D:\java\jdk\jre\lib\deploy.jar;D:\java\jdk\jre\lib\ext\access-bridge-64.jar;D:\java\jdk\jre\lib\ext\cldrdata.jar;D:\java\jdk\jre\lib\ext\dnsns.jar;D:\java\jdk\jre\lib\ext\jaccess.jar;D:\java\jdk\jre\lib\ext\jfxrt.jar;D:\java\jdk\jre\lib\ext\localedata.jar;D:\java\jdk\jre\lib\ext\nashorn.jar;D:\java\jdk\jre\lib\ext\sunec.jar;D:\java\jdk\jre\lib\ext\sunjce_provider.jar;D:\java\jdk\jre\lib\ext\sunmscapi.jar;D:\java\jdk\jre\lib\ext\sunpkcs11.jar;D:\java\jdk\jre\lib\ext\zipfs.jar;D:\java\jdk\jre\lib\javaws.jar;D:\java\jdk\jre\lib\jce.jar;D:\java\jdk\jre\lib\jfr.jar;D:\java\jdk\jre\lib\jfxswt.jar;D:\java\jdk\jre\lib\jsse.jar;D:\java\jdk\jre\lib\management-agent.jar;D:\java\jdk\jre\lib\plugin.jar;D:\java\jdk\jre\lib\resources.jar;D:\java\jdk\jre\lib\rt.jar;D:\JavaSE\基础语法\out\production\基础语法 多线程.Create
我在看代码--0
我在看代码--1
我在看代码--2
我在看代码--3
我在看代码--4
我在看代码--5
我在看代码--6
我在看代码--7
我在看代码--8
我在看代码--9
我在看代码--10
我在看代码--11
我在看代码--12
我在看代码--13
我在看代码--14
我在看代码--15
我在看代码--16
我在看代码--17
我在看代码--18
我在看代码--19
我在学习多线程--0
我在学习多线程--1
我在学习多线程--2
我在学习多线程--3
我在学习多线程--4
我在学习多线程--5
我在学习多线程--6
我在学习多线程--7
我在学习多线程--8
我在学习多线程--9
我在学习多线程--10
我在学习多线程--11
我在学习多线程--12
我在学习多线程--13
我在学习多线程--14
我在学习多线程--15
我在学习多线程--16
我在学习多线程--17
我在学习多线程--18
我在学习多线程--19进程已结束,退出代码0*/

调用start()方法穿插执行代码,并且每次运行的结果都不相同(穿插顺序不同)

package 多线程;
//继承Thread类,重写run,调用start开启线程
public class Create extends Thread{@Overridepublic void run() {//run方法线程体for(int i = 0;i<20;++i){System.out.println("我在看代码--" + i);}}public static void main(String[] args) {//主方法main线程,主线程//创建一个线程对象Create create = new Create();//调用start()方法,开启线程create.start();for (int i = 0; i < 20; i++) {System.out.println("我在学习多线程--" + i);}}
}
/*
结果为:
我在学习多线程--0
我在看代码--0
我在学习多线程--1
我在看代码--1
我在看代码--2
我在看代码--3
我在看代码--4
我在看代码--5
我在学习多线程--2
我在看代码--6
我在看代码--7
我在看代码--8
我在学习多线程--3
我在学习多线程--4
我在看代码--9
我在学习多线程--5
我在看代码--10
我在看代码--11
我在学习多线程--6
我在看代码--12
我在学习多线程--7
我在看代码--13
我在学习多线程--8
我在看代码--14
我在学习多线程--9
我在看代码--15
我在学习多线程--10
我在看代码--16
我在学习多线程--11
我在看代码--17
我在学习多线程--12
我在看代码--18
我在学习多线程--13
我在看代码--19
我在学习多线程--14
我在学习多线程--15
我在学习多线程--16
我在学习多线程--17
我在学习多线程--18
我在学习多线程--19进程已结束,退出代码0
*/

下面为一个多线程图片保存的实例:

package 多线程;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;//练习Thread,实现多线程同步下载图片
public class PicLoad extends Thread{private String url;private String name;public PicLoad(String url, String name) {this.url = url;this.name = name;}@Overridepublic void run() {WebDownloader webDownloader = new WebDownloader();webDownloader.downloader(url, name);System.out.println("下载了文件名为:" + name);}
}
//下载器
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方法出现问题");}}
}
class Test{public static void main(String[] args) {PicLoad p1 = new PicLoad("https://pic1.zhimg.com/80/v2-86c0da0f749a46a1a7a2c7b80465d530_720w.jpg?source=1940ef5c", "qzy.jpg");PicLoad p2 = new PicLoad("https://ts1.cn.mm.bing.net/th?id=OIP-C.5eGvoxrfiCR8-F954A0g2gAAAA&w=146&h=170&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2", "bqb.jpg");PicLoad p3 = new PicLoad("https://ts1.cn.mm.bing.net/th?id=OIP-C.q5iRYT4Q_g_r7UBqAON9UwAAAA&w=146&h=170&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2", "xzc.jpg");p1.start();p2.start();p3.start();}
}
/*
结果为:
下载了文件名为:qzy.jpg
下载了文件名为:xzc.jpg
下载了文件名为:bqb.jpg
*/

结果成功保存了三张图片,但是保存顺序发生了变化,即为多线程的理念。

方法二:实现Runnable接口(推荐)

定义MyRunna类实现Runna接口

实现run()方法,编写线程执行体

创建线程对象,调用start()方法启动线程

package 多线程;
//方法二:实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类,调用start开启线程
public class Create2 implements Runnable{@Overridepublic void run() {//run方法线程体for(int i = 0;i<20;++i){System.out.println("我在看代码--" + i);}}public static void main(String[] args) {//创建Runnable接口的实现类对象Create2 create2 = new Create2();//创建线程对象,通过线程对象来开启我们的线程,代理Thread thread = new Thread(create2);thread.start();//new Thread(create2).start();//二者等价for (int i = 0; i < 20; i++) {System.out.println("我在学习多线程--" + i);}}
}

输出结果也为穿插输出

抢票实例:

package 多线程;public class Create3 implements Runnable{//票数private int ticketNums = 10;@Overridepublic void run() {while (true){if(ticketNums<=0){break;}System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "票");}}public static void main(String[] args) {Create3 ticket = new Create3();new Thread(ticket, "小明").start();new Thread(ticket, "老师").start();new Thread(ticket, "黄牛党").start();}
}
/*
黄牛党拿到了第10票
黄牛党拿到了第7票
黄牛党拿到了第6票
黄牛党拿到了第5票
小明拿到了第8票
小明拿到了第3票
老师拿到了第9票
老师拿到了第1票
小明拿到了第2票
黄牛党拿到了第4票
*/

龟兔赛跑实例:

package 多线程;
//龟兔赛跑模拟
public class Rabbit implements Runnable{//胜利者private static String winner;public void run(){for (int i = 0; i <= 100; i++) {//模拟兔子休息if(Thread.currentThread().getName().equals("兔子")&&i%10==0){try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}//判断比赛是否结束boolean flag = gameover(i);if(flag){break;}System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");}}//判断是否完成比赛private boolean gameover(int steps){//判断是否有胜利者if(winner!=null){//已经存在胜利者了return true;}if(steps>=100){winner = Thread.currentThread().getName();System.out.println("winner is " + winner);return true;}return false;}public static void main(String[] args) {Rabbit rabbit = new Rabbit();new Thread(rabbit, "兔子").start();new Thread(rabbit, "乌龟").start();}
}
//无论怎样都是乌龟获胜

方法三:实现Callable接口

实现方法:

实现Callable接口,设置返回值

重写call方法,并抛出异常

创建目标对象

进入主函数......

package 多线程;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;//方法三:实现callable接口
/*
可以定义返回值
可以抛出异常
实现复杂
*/
public class TestCallable implements Callable<Boolean> {private String url;private String name;public TestCallable(String url, String name) {this.url = url;this.name = name;}public Boolean call() {WebDownloader webDownloader = new WebDownloader();webDownloader.downloader(url, name);System.out.println("下载了文件名为:" + name);return true;}public static void main(String[] args) throws Exception, InterruptedException{TestCallable t1 = new TestCallable("https://pic1.zhimg.com/80/v2-86c0da0f749a46a1a7a2c7b80465d530_720w.jpg?source=1940ef5c", "qzy.jpg");TestCallable t2= new TestCallable("https://ts1.cn.mm.bing.net/th?id=OIP-C.5eGvoxrfiCR8-F954A0g2gAAAA&w=146&h=170&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2", "bqb.jpg");TestCallable t3 = new TestCallable("https://ts1.cn.mm.bing.net/th?id=OIP-C.q5iRYT4Q_g_r7UBqAON9UwAAAA&w=146&h=170&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2", "xzc.jpg");//创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(3);//提交执行服务:Future<Boolean> result1 = ser.submit(t1);Future<Boolean> result2 = ser.submit(t2);Future<Boolean> result3 = ser.submit(t3);//获取结果:boolean rs1 = result1.get();boolean rs2 = result2.get();boolean rs3 = result3.get();//关闭服务ser.shutdownNow();}}
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方法出现问题");}}
}
/*
结果为:
下载了文件名为:bqb.jpg
下载了文件名为:xzc.jpg
下载了文件名为:qzy.jpg
*/

Java之多线程详解相关推荐

  1. 【狂神说Java】多线程详解

    [狂神说Java]多线程详解 1.任务 生活中的例子.边吃饭.边玩手机 开车.打电话.挂点滴 上厕所.玩手机 现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时 ...

  2. 厚积薄发打卡Day25 :狂神说Java之多线程详解<全网最全(代码+笔记)>

    概述 视频来源:[狂神说Java]多线程详解 强烈推荐,

  3. Java基础----多线程详解

    一.简介 1.什么是线程? 要解释线程,就必须明白什么是进程. 2.什么是进程呢? 进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间),比如用户点击桌面的IE浏览器,就启动了一个进程 ...

  4. 多线程详解第1讲:线程简介

    此笔记为 [狂神说Java]多线程详解 听课笔记 B站视频链接 [狂神说Java]多线程详解 ,狂神讲解的多线程非常通俗易懂,建议大家可以配合此笔记听课. 目录 线程简介 1.多任务 2.多线程 3. ...

  5. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  6. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  7. Java多线程详解(线程不安全案例)

    嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1.  Java多线程详解(基本概念)​​​​​​​ 2. Java多线程详解(如何创建线程) ...

  8. Java多线程详解(基本概念)

    嗨喽-小伙伴们我来啦, 从本章开始,我们就要开始介绍Java中一个非常重要的概念-----多线程.线程化思想是计算机领域的重要思想,有了线程,咱编写的程序才能更为高效准确地运行起来. 首先,咱来了解一 ...

  9. Java 多线程详解(五)------线程的声明周期

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 Java 多线程详解(二 ...

最新文章

  1. mysql 中文截取_mysql 截取中文字符
  2. Intel x86架构之多处理器与APIC
  3. python下载付费文档教程-付费?是不可能的!处理 PDF 只需几行代码,彻底解放双手!...
  4. 计算机网络实验报告哈工大_哈工大计算机网络实验报告.doc
  5. MacBook开机自动连接iPad好评
  6. php printf 0.2f,php printf()
  7. Harmony OS — PageSlider滑动页面
  8. PEST分析顺丰服务需求_这个工作值不值得去做?4种分析模型及3种曲线让你学会观察行业...
  9. 工业相机视场和分辨率计算
  10. 约瑟夫生死者游戏_独立游戏从死者特许经营中夺冠时,游戏玩家获胜
  11. php红包现金,php实现微信支付之现金红包
  12. SpringClout 入门笔记
  13. oracle 主键、唯一键值、唯一索引关系
  14. GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB
  15. 市值一夜间蒸发千亿,拼多多离不开黄峥?
  16. 接受-拒绝采样算法详细证明
  17. QQ空间视频下载详细教程(手机端)
  18. 坚持学习100天:Typedef 重(chong)定义还是重(zhong)定义呢?
  19. Java 中文字符判断 中文标点符号判断
  20. Spring学习——新建module模块

热门文章

  1. searchUI-微信小程序 搜索插件
  2. 不懂第三方网站、App如何接入微信登录怎么办?这里我详解单点登录之第三方微信登录(建议收藏)
  3. 【python学习】数据预处理-如何归一化?
  4. android11.0 Launcher3 高端定制之新应用图标自动添加主屏幕
  5. Python爬虫学习之爬取淘宝搜索图片
  6. 小程序实现活动倒计时功能
  7. Redis学习笔记 - Lua脚本(2) - Lua脚本的实现
  8. Qt学习之路(24): QPainter(改写paintEvent)
  9. Microsoft Remote Desktop for Mac(远程桌面连接工具)
  10. 郑豪8.31月K收官提防大洗盘,日K箱体先高空,黄金亚欧盘最新操作建议