关键词:
传送门==>B站遇见狂神说Java多线程详解
做笔记时有的知识点并没有整理;
ml
1.线程创建之继承Thread类
- 首先自定义线程类继承Thread类;
- 然后是重写run( )方法;编写线程执行体
- 然后创建自定义线程对象;使用start()方法启动线程
注意:
线程开启并不一定是直接就执行;得看CPU的调度,或者说的根据CPU的实际资源情况
;
代码练习:
创建MyThread
/**
* 线程创建之继承Thread类;
*/
//1.首先继承Thread类;
public class MyThread01 extends Thread
//2.然后是重写run方法;编写执行的线程;
@Override
public void run()
//run方法 线程的执行体;
for (int i = 0; i < 100; i++)
System.out.println("我是run方法->"+i);
//mian方法;(主线程)
public static void main(String[] args)
//创建线程对象;
MyThread01 myThread01=new MyThread01();
//3.使用start方法启动线程;
myThread01.start();
//main方法 线程的执行体;
for (int i = 0; i < 100; i++)
System.out.println("我是main方法->"+i);
线程交替执行
而如果不使用start方法启动线程呢;直接在main方法中调用run方法;那就按着方法的调用顺序执行了,依次有序地执行
图片下载练习
//继承Thread类;
public class MyThread02 extends Thread
//定义网页地址和文件名;
private String url;
private String name;
//构造方法;初始化;
public MyThread02(String url, String name)
this.url = url;
this.name = name;
//重写run方法
@Override
public void run()
//创建下载器对象;
WebDownLoader wdl=new WebDownLoader();
//调用下载方法;
wdl.dowLoade(url,name);
System.out.println("下载文件名=>"+name);
//主方法;
public static void main(String[] args)
MyThread02 myT1=new MyThread02("https://www.baidu.com/link?url=dvRgPF9UDWw42jQF0lr8EnKMw2XfU_NKhWqanB4wL85sqwWrGBVnBAGd3zBJUJ0JZa0d3ryBEd6FCiZfrG1ax0o3EkygROiBPwUrzEFRoC4DK6S5DSiMz1Q1Ge_O8vyNbE8IzW1Kn2WGbHDgGzx4yhlQsOadV1rFqemy4Os4lhBMAxGLXZ2CY5ftLFMYzxUgZbFIw5qtkPUajas-nPD4yyk118flZrp6Dj6HOAfwKB-X0xbxH2ttXMocCGzVHuwGm0a0Orw8A_cqyOm3tDvXMhKu3YSYHtKDkisZqupVBI3pJhhvP97RCXacC0jtynAXvUrPz4OAhT_QvMfWp7akjFP5gBFiK_5Tt2BwRchJ1YgenbZwqGucGAopjBtmlKeAKOmkaVJ12wiG6u7Y85YNIlGo__O0ZgurYtRb4WbOZTxsBX_e0XrBB0klH2V2BJM3YuEyMpc_6sZdwhYnj4JCltSh1oca5jDlQ51Tu2LHqI-SeDhvi_ioBAno4NzkQqEI_rhRIJSUqb7EVBjO7sTEB8qohgcbM9ZtD-3fqTYTRZBQ97W0o5p2tUTEVuXDTM0FeunmEEoiaLeBCSJbB8to09OYCCy9C-e2CZyaaiIAnXvAlAILYMaHh0a1ANXLzFR1&wd=&eqid=9a0261300016198200000005611d721a","图1.jpg");
MyThread02 myT2=new MyThread02("https://www.baidu.com/link?url=dvRgPF9UDWw42jQF0lr8EnKMw2XfU_NKhWqanB4wL85sqwWrGBVnBAGd3zBJUJ0JZa0d3ryBEd6FCiZfrG1ax0o3EkygROiBPwUrzEFRoC4DK6S5DSiMz1Q1Ge_O8vyNbE8IzW1Kn2WGbHDgGzx4yhlQsOadV1rFqemy4Os4lhBMAxGLXZ2CY5ftLFMYzxUgZbFIw5qtkPUajas-nPD4yyk118flZrp6Dj6HOAfwKB-X0xbxH2ttXMocCGzVHuwGm0a0Orw8A_cqyOm3tDvXMhKu3YSYHtKDkisZqupVBI3pJhhvP97RCXacC0jtynAXvUrPz4OAhT_QvMfWp7akjFP5gBFiK_5Tt2BwRchJ1YgenbZwqGucGAopjBtmlKeAKOmkaVJ12wiG6u7Y85YNIlGo__O0ZgurYtRb4WbOZTxsBX_e0XrBB0klH2V2BJM3YuEyMpc_6sZdwhYnj4JCltSh1oca5jDlQ51Tu2LHqI-SeDhvi_ioBAno4NzkQqEI_rhRIJSUqb7EVBjO7sTEB8qohgcbM9ZtD-3fqTYTRZBQ97W0o5p2tUTEVuXDTM0FeunmEEoiaLeBCSJbB8to09OYCCy9C-e2CZyaaiIAnXvAlAILYMaHh0a1ANXLzFR1&wd=&eqid=9a0261300016198200000005611d721a","图2.jpg");
MyThread02 myT3=new MyThread02("https://www.baidu.com/link?url=dvRgPF9UDWw42jQF0lr8EnKMw2XfU_NKhWqanB4wL85sqwWrGBVnBAGd3zBJUJ0JZa0d3ryBEd6FCiZfrG1ax0o3EkygROiBPwUrzEFRoC4DK6S5DSiMz1Q1Ge_O8vyNbE8IzW1Kn2WGbHDgGzx4yhlQsOadV1rFqemy4Os4lhBMAxGLXZ2CY5ftLFMYzxUgZbFIw5qtkPUajas-nPD4yyk118flZrp6Dj6HOAfwKB-X0xbxH2ttXMocCGzVHuwGm0a0Orw8A_cqyOm3tDvXMhKu3YSYHtKDkisZqupVBI3pJhhvP97RCXacC0jtynAXvUrPz4OAhT_QvMfWp7akjFP5gBFiK_5Tt2BwRchJ1YgenbZwqGucGAopjBtmlKeAKOmkaVJ12wiG6u7Y85YNIlGo__O0ZgurYtRb4WbOZTxsBX_e0XrBB0klH2V2BJM3YuEyMpc_6sZdwhYnj4JCltSh1oca5jDlQ51Tu2LHqI-SeDhvi_ioBAno4NzkQqEI_rhRIJSUqb7EVBjO7sTEB8qohgcbM9ZtD-3fqTYTRZBQ97W0o5p2tUTEVuXDTM0FeunmEEoiaLeBCSJbB8to09OYCCy9C-e2CZyaaiIAnXvAlAILYMaHh0a1ANXLzFR1&wd=&eqid=9a0261300016198200000005611d721a","图3.jpg");
//启动线程;
myT1.start();
myT2.start();
myT3.start();
//创建下载器;
class WebDownLoader
//下载方法;
public void dowLoade(String url,String name)
try
FileUtils.copyURLToFile(new URL(url),new File(name));
catch (IOException e)
e.printStackTrace();
System.out.println("下载方法有问题, IO异常");
运行;下载时并不会按照顺序,
2.线程创建之实现Runnable接口
可避免单继承的局限性;方便一个对象被多个线程使用.
- 自定义类实现Runnable接口;
- 重写run()方法,编写线程执行体
- 创建自定义线程对象放入Thread对象中,start()方法启动线程
代码练习
/**
* 创建线程之实现Runnable接口
*/
//实现Runnable接口;
public class MyThread03 implements Runnable
//重写run方法;
@Override
public void run()
//run方法 线程的执行体;
for (int i = 0; i < 100; i++)
System.out.println("我是run方法->" + i);
//主方法;
public static void main(String[] args)
//创建实现类的对象;
MyThread03 myThread03 = new MyThread03();
//创建线程对象;启动线程
new Thread(myThread03).start();
//main方法 线程的执行体;
for (int i = 0; i < 100; i++)
System.out.println("我是main方法->" + i);
买票案例
多个线程去操作同一份资源,线程不安全
//实现Runnable接口;
public class MyThreadToTicket implements Runnable
//定义车票数量;
private int ticket=10;
//重写run方法;
@Override
public void run()
while(true)
//票买完就停了;
if(ticket<=0)
break;
try
//定义延时;
Thread.sleep(300);
catch (InterruptedException e)
e.printStackTrace();
//Thread.currentThread().getName():可获取到当前线程的名字;
System.out.println(Thread.currentThread().getName() + "::买到了第" + ticket-- + "个票");
//主方法;
public static void main(String[] args)
//创建自定义类的对象;
MyThreadToTicket mt=new MyThreadToTicket();
//创建Thread对象,启动线程;
new Thread(mt,"阿杰").start();
new Thread(mt,"阿猫").start();
new Thread(mt,"阿伟").start();
运行时,出现两个人买到同一张票的问题.
模拟龟兔赛跑
//实现Runnable接口;
public class TorAndRabRun implements Runnable
//定义胜利者;
private static String win;
//判断是否结束比赛; step:步数;
private boolean over(int step)
//若已有获胜者,则结束;
if(win!=null)
return true;
//若已经跑完了,结束比赛;
if(step>=100)
win=Thread.currentThread().getName();
System.out.println("获胜者" + win);
return true;
return false;
//重写run方法
@Override
public void run()
for (int i = 0; i <= 101; i++)
//模拟兔子睡觉;
if(Thread.currentThread().getName().equals("兔纸")&&i%10==0)
try
Thread.sleep(300);
catch (InterruptedException e)
e.printStackTrace();
//若比赛结束,终止循环;
if (over(i))
break;
//Thread.currentThread().getName():会获取线程名;
System.out.println(Thread.currentThread().getName()+"==>跑"+i+"米");
//主方法;
public static void main(String[] args)
//创建赛道对象;
TorAndRabRun tar=new TorAndRabRun();
//创建线程对象,启动线程;
new Thread(tar,"乌龟").start();
new Thread(tar,"兔纸").start();
3.线程创建之实现Callable接口
- 实现callable接口,需要返回值类型;
- 重写call方法;需要抛出异常类型;
- 创建自定义线程的对象;
- 开启服务;
- 提交执行;
- 获取结果;
- 关闭服务
使用之前的多线程下载图片案例;
/**
* 线程创建之实现Callable接口;和前两种不同的是该方式可产生返回值;
*/
//实现Callable接口;
public class MyThread04 implements Callable<Boolean>
//定义网页地址和文件名;
private String url;
private String name;
//构造方法;初始化;
public MyThread04(String url, String name)
this.url = url;
this.name = name;
//重写callable方法;
@Override
public Boolean call() throws Exception
//创建下载器对象;
WebDownLoader wdl=new WebDownLoader();
//调用下载方法;
wdl.dowLoade(url,name);
System.out.println("下载文件名=>"+name);
return null;
//主方法
public static void main(String[] args) throws ExecutionException, InterruptedException
//创建实现类的对象;
MyThread04 myT1=new MyThread04("https://img-blog.csdnimg.cn/20210613214620230.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yVHVtbnVz,size_16,color_FFFFFF,t_70","图片1.png");
MyThread04 myT2=new MyThread04("https://img-blog.csdnimg.cn/20210613214620230.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yVHVtbnVz,size_16,color_FFFFFF,t_70","图片2.png");
MyThread04 myT3=new MyThread04("https://img-blog.csdnimg.cn/20210613214620230.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yVHVtbnVz,size_16,color_FFFFFF,t_70","图片3.png");
//开启服务;(创建线程池)
ExecutorService es= Executors.newFixedThreadPool(3);
//执行服务提交;
Future<Boolean> ft1=es.submit(myT1);
Future<Boolean> ft2=es.submit(myT2);
Future<Boolean> ft3=es.submit(myT3);
//获取返回结果;
Boolean res1 = ft1.get();
Boolean res2 = ft2.get();
Boolean res3 = ft3.get();
System.out.print(res1);
System.out.print(res2);
System.out.print(res3);
//关闭服务;
es.shutdownNow();
//创建下载器;
class WebDownLoader
//下载方法;
public void dowLoade(String url,String name)
try
FileUtils.copyURLToFile(new URL(url),new File(name));
catch (IOException e)
e.printStackTrace();
System.out.println("下载方法有问题, IO异常");
也是交替执行的;
4.静态代理模式
- 真实对象(目标对象)和代理对象都要实现同一个接口;
- 代理对象要代理真实角色;
- 代理对象可实现真实对象不能完成的方法;
- 真实对象专注自己的实现;
public class StaticProxy
public static void main(String[] args)
//代理 | 真实 | 需要完成的事情;
//new Thread(()->System.out.println("完成")).start();
/* //创建真实角色对象;
Person ps=new Person();
//创建代理角色对象;
ProxyPerson prop=new ProxyPerson(ps);
prop.Happy();*/
//实际上,可精简为;
// 代理 | 真实 | 需要完成的事情;
new ProxyPerson(new Person()).Happy();
//接口;
interface Marry
//抽象方法;
void Happy();
//人;(真实角色)
class Person implements Marry
@Override
public void Happy()
System.out.println("真实角色出场");
//中介;(代理角色)
class ProxyPerson implements Marry
//定义目标对象1;
private Marry targetP;
//构造方法;
public ProxyPerson(Marry targetP)
this.targetP = targetP;
@Override
public void Happy()
//调用之前要完成的方法;
brfore();
//执行方法;
this.targetP.Happy();
//调用之后要完成的方法
after();
//之前要进行的方法;
private void brfore()
System.out.println("前面要完成的事情;");
//之后要进行的方法;
private void after()
System.out.println("后面要完成的事情;");
5.Lambda表达式
lambda:
λ:希腊字母表第11位;
使用目的是为了避免匿名内部类定义过多;实质上属于函数式编程;
-----------------------------------
(params)->expression [表达式]
(params)->statement (语句)
-----------------------------------
函数式接口:(Functional Interface)
----------------------------------
函数式接口定义:
只包含唯一的抽象方法;
可使用lambda表达式创建接口对象
练习;使用不同的方式实现输出接口方法;
public class DemoLamDa01
//2.使用静态内部类;
static class FunImpl02 implements FunMeth
@Override
public void OnlyMethod狂神说java笔记--反射和注解部分笔记(代码片段)
传送门==>B站遇见狂神说–反射和注解笔记和练习只是跟着视频整理的;但是有的知识点并没有整理进来.ml1.什么是注解2.内置注解3.元注解4.自定义注解5.反射概述6.获得反射对象7.获取Class类的方式8.所有类型的Class对象9.类... 查看详情
狂神说java笔记--网络编程部分笔记(代码片段)
传送门==>B站遇见狂神说—网络编程笔记和练习只是跟着视频整理的;有的知识点并没有整理进来.ml1.什么是计算机网络2.网络通信的两个要素3.IP地址4.port:端口5.通信协议6.TCP实现聊天7.TCP文件上传实现8.UDP消息发送9.UDP实现... 查看详情
遇见狂神说--记录mysql部分笔记(代码片段)
传送门==>B站遇见狂神说—MySql详解最近在复习mysql,笔记和练习只是跟着视频整理的;但是有的知识点并没有整理进来.ml1.基本操作2.列的数据类型3.字段属性4.创建数据表练习5.MyIsAM,Innodb区别6.关于修改删除数据表字段7.外键... 查看详情
java后端开发工程师学习笔记狂神说java笔记(代码片段)
目录面试题库阶段一:Java基础1.计算机基础2.Java入门学习3.java基础语法4.流程控制5.方法6.数组7.面向对象编程8.异常9.常用类10.集合框架11.IO流12.多线程13.GUI编程14.网络编程15.注解和反射16.JUC编程17.JVM探究阶段二:前端基础... 查看详情
遇见狂神说---javaweb部分笔记(代码片段)
传送门==>B站遇见狂神说—JavaWeb入门到实战最近开始复习web部分;笔记和练习只是跟着视频整理的;但是有的知识点并没有整理进来(比如一些基础概念,安装步骤)ml1.web基本;Tomcat安装使用2.http详细讲解3.maven3.1IDEA中使用Maven3.1... 查看详情
狂神说javamysql最新教程通俗易懂--jdbc详解笔记(代码片段)
目录狂神视频地址2.JDBC3、第一个JDBC程序4、Statement对象详解5.PreparedStatement对象5.1、新增5.2、删除5.3、修改5.4、查询5.5、防止SQL注入6、使用IDEA连接数据库7、事务8.数据库连接池狂神视频地址https://www.bilibili.com/video/BV1NJ411J79W?p=4... 查看详情
b站狂神说java笔记-面向对象编程(代码片段)
目录狂神视频地址1.面向过程&面向对象2.构造方法3.封装4.继承5.重写6.多态7.static详解8.抽象类9.接口10.内部类狂神视频地址https://www.bilibili.com/video/BV12J41137hu1.面向过程&面向对象面向过程思想: 步骤清晰简单、第一步... 查看详情
狂胜说mybatis笔记(代码片段)
目录狂神说MyBatis01:第一个程序狂神说MyBatis02:CRUD操作及配置解析狂神说MyBatis03:ResultMap及分页狂神说MyBatis04:使用注解开发狂神说MyBatis05:一对多和多对一处理多对一的处理一对多的处理狂神说MyBatis06:... 查看详情
b站狂神说java笔记-java流程控制(代码片段)
目录狂神视频地址1.Scanner类next():nextLine():2.顺序结构3.选择结构4.switch多选择语句5.循环结构狂神视频地址https://www.bilibili.com/video/BV12J41137hu1.Scanner类 通过scanner类的next()与nextLine()方法获取输入的字符串,在读取我们一... 查看详情
狂神说java---记录spring学习笔记(代码片段)
☞传送门==>B站遇见狂神说—Spring5教程感谢狂神,学习视频真的是通俗易懂♥♥♥笔记和练习只是跟着视频整理的;有的知识点并没有整理进来ml1.Spring概述2.控制反转IOC3.试试Spring3.1IOC创建对象的方式3.2Spring配置说明3.3DI(依... 查看详情
b站狂神说java---记录springmvc学习笔记(代码片段)
B站学习传送门==>【狂神说Java】SpringMVC最新教程IDEA版通俗易懂感谢狂神❤ml1.回顾servlet2.SpringMVC概述3.SpringMVC执行原理4.深入理解5.使用注解进行springmvc的配置6.controller配置小结首先看看实现Controller接口的方式使用注解的... 查看详情
遇见狂神说java笔记---mybatis学习(代码片段)
☞传送门==>B站遇见狂神说–Mybatis教程感谢狂神,学习视频真的是通俗易懂♥♥♥笔记和练习只是跟着视频整理的;有的知识点并没有整理进来ML1.什么是Mybatis1.1如何获取/下载Mybatis1.2什么是持久化,持久层1.3为什么需要Mybatis... 查看详情
b站狂神说java笔记-数组(代码片段)
目录狂神视频地址1.数组的定义2.数组声明和创建3.Java内存分析4.三种初始化5.数组的四个基本特点6.求数组最大值7.打印数组8.反转数组9.多维数组10.Arrays类11.冒泡排序12.稀疏数组狂神视频地址https://www.bilibili.com/video/BV12J41137hu1.数... 查看详情
b站狂神说java笔记-java基础语法(代码片段)
目录狂神视频地址1.注释:2.标识符3.数据类型4.什么是字节5.进制问题6.类型转换7.变量8.常量9.运算符10.包机制狂神视频地址https://www.bilibili.com/video/BV12J41137hu1.注释: 注释并不会被执行,是写给我们写代码的人看的... 查看详情
b站狂神说java笔记-java方法(代码片段)
目录狂神视频地址狂神视频地址https://www.bilibili.com/video/BV12J41137hu Java方法是语句的集合,他们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他第被调用... 查看详情
b站狂神说java笔记-注解和反射(代码片段)
目录狂神视频地址1.什么是注解?2.内置注解3.元注解4.自定义注解5.Java反射概述6.Class类7.哪些类型可以有Class对象?8.类加载与内存分析9.什么时候会发生类的初始化10.类加载器的作用11.调用指定方法12.反射操作泛型13.获取... 查看详情
b站狂神说java笔记-java入门学习
目录狂神视频地址Java特性Java三大版本JDK、JRE、JVM是什么?Java程序的运行机制狂神视频地址https://www.bilibili.com/video/BV12J41137huJava特性简单性面向对象可移植性(跨平台)高性能分布式动态性(反射)多线程安全... 查看详情
b站狂神说java笔记-网络编程(代码片段)
目录狂神视频地址1.计算机网络概念2.IP3.端口4.通信协议狂神视频地址https://www.bilibili.com/video/BV1LJ411z7vY?p=111.计算机网络概念 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连... 查看详情