首页 > 编程语言 >Java学习之多线程

Java学习之多线程

时间:2023-02-25 18:34:50浏览次数:37  
标签:Java Thread void class 学习 线程 new 多线程 public

线程的三种创建线程

  • Thread class: 继承实现线程类(不建议使用)
  • Runnable接口:实现接口(推荐使用,避免单继承局限性)
  • Callable接口: 实现接口(了解)

Thread Class 实现方式

1.创建一个类,用于继承Thread类,重写里面的run()方法。

2.创建线程对象,调用启动线程。

3.线程由cpu调度实现重写的run()方法。

public class Demo1 extends Thread{
    //重写run()方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("继承线程类,重写线程体:就是重写线程类里的run()方法");
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        //创建线程对象
        Demo1 demo1 = new Demo1();
        //启动线程
        demo1.start();
        for (int i = 0; i < 2000; i++) {
            System.out.println("我是主方法");
        }
    }
}

普通方法调用和多线程调用

​ 线程执行时,主线程也会继续执行。

​ 线程开启不一定马上执行,由cpu调度安排。

实现多线程下载网图

1.安装commons-io.jar包,在项目下新建lib文件夹,拷贝到lib,右键包,选择Add a library.此时包就可以使用

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;

public class WebDownload {
    public static void main(String[] args) {
        Image i1 = new Image("https://image.baidu.com/search/detail?","1");
        Image i2 = new Image("https://image.baidu.com/search/detail?" ,"2");
        Image i3 = new Image("https://image.baidu.com/search/detail?","3");

        i1.start();
        i2.start();
        i3.start();
    }
}

//图片信息类,实现线程继承
class Image extends Thread{
    private String url;
    private String name;

    @Override
    public void run() {
        Download download = new Download();
        download.down(url,name);
        System.out.println("下载了"+name);
    }

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

//创建一个下载器
class Download{
    public void down(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,方法出现问题");
        }
    }
}

代码逻辑:

  1. 首先创建了一个类完成下载器功能,调用commons-io.jar的文件工具类实现了用url下载网络图片的方法。
  2. 创建线程对象类,Image继承Thread类,定义了图片所需参数,重写run()方法,在方法体中创建了下载器对象,调用了下载的方法。
  3. 在启动类中创建多个线程对象,启动线程。

Runnable接口实现方式

声明Runnable接口实现类,实现run()方法,创建实现类实例,当成参数传递给线程并启动。

public class Demo1 implements Runnable{
    //实现run()方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("实现Runnable接口");
        }
    }

    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        //以下可以简化:new Thread(demo1).start();
        Thread thread = new Thread(demo1);//Thread中传入接口实现类对象是因为Thread中有这个构造方法
        thread.start();
    }
}

多个线程实现同种对象

案例:龟兔赛跑

/**
 * 多线程实现同种对象
 * 线程同步问题,数据紊乱。
 */
public class Test1 implements Runnable{
    int num =10;//票数
    @Override
    public void run() {
        while (true){
            if(num<=0)break;
          //模拟网络延时可以方法问题的发生性
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"抢到了第"+num--+"张票");
        }
    }
    public static void main(String[] args) {
        Test1 test = new Test1();
        new Thread(test,"小红").start();
        new Thread(test,"老师").start();
        new Thread(test,"黄牛").start();

    }
}

实现静态代理与Thread线程对比

//静态代理也需要真实对象,但是通过代理可以实现更多的事:婚庆案例

Lamda表达式

增强for遍历:

//格式:for(元素的数据类型 变量名:数组或者集合)
for(String s:list){
  sout(s);
}
//将数组list里的元素一个个取值出来赋给s
//idea快捷键:数组名.for

Lambda表达式的作用:简化匿名内部类,但并不是所有的匿名内部类都可以简化,只有函数式匿名内部类可以

/**
 * 函数式编程思想:忽略面向对象的复杂语法,强调做什么,而不是谁去做。强调方法体,而不是对象
 * Lambda表达式格式
 * ()-> {}
 * ():对应着方法的形参
 * ->:固定格式
 * {}:对应着方法的方法体
 */
public class Demo1 {
    public static void main(String[] args) {
        //匿名内部类
        method(new Swing(){
            @Override
            public void swimming(){
                System.out.println("游泳");
            }
        });
        //简化
        method(()->{
            System.out.println("继续游泳");
        });
    }

    private static void method(Swing s) {
        s.swimming();
    }
}
interface Swing{
    public abstract void swimming();
}

对于函数式接口,可以通过lambda表达式来创建该接口的对象

/**
 * 推导Lambda表达式
 */
public class LambdaTest1 {
    //3.静态内部类
    static class FunTrue2 implements Fun{
        @Override
        public void function1() {
            System.out.println("I Love Lambda~~~");
        }
    }

    public static void main(String[] args) {
        //实现类的实现方式
        new FunTrue().function1();
        //静态内部类的实现方式
        new FunTrue2().function1();

        //4.局部内部类
        class FunTrue3 implements Fun{
            @Override
            public void function1() {
                System.out.println("I Love Lambda!!!");
            }
        }
        //局部内部类的实现方式
        new FunTrue3().function1();

        //5.匿名内部类
        new Fun(){
            @Override
            public void function1() {
                System.out.println("I Love ...");
            }
        }.function1();
        
        //用Lambda简化:表达式只能简化函数式接口的匿名内部类写法
        Fun like = () -> {
            System.out.println("Lambda");
        };
        like.function1();
    }
}
//1.定义一个函数式接口
interface Fun{
    void function1();
}
//2.实现类
class FunTrue implements Fun{
    @Override
    public void function1() {
        System.out.println("I Love Lambda!");
    }
}
  

线程的生命周期

线程停止建议使用自定义标识位,不要使用线程类的关闭。

Start()是让线程进入就绪态,而不是调度。

new线程是创建线程。

线程休眠:sleep();每个线程都有一个锁,sleep不会释放锁。

线程礼让:不一定成功。让当前正在执行的线程暂停,而不是阻塞。yield();

线程强制执行:Join方法。可以想象成插队。

守护线程与普通线程

线程同步

多个线程操作同一个资源:并发

线程池

实现重复利用,便于线程管理。

标签:Java,Thread,void,class,学习,线程,new,多线程,public
From: https://www.cnblogs.com/zkit/p/17154977.html

相关文章

  • Pytorch学习相关资料
    【金山文档】PyTorch_tutorial_0.0.5_余霆嵩​​https://kdocs.cn/l/coX54VFlWRKk​​原网站code+data+pdf:​​https://github.com/TingsongYu/PyTorch_Tutorial​​......
  • PMP学习笔记《第十二章 项目采购管理》
    3个过程:1、规划采购管理:做出采购决策、明确采购方法、识别潜在卖方、准备获取建议;2、实施采购:获取卖方应答、选择卖方、授予合同;3、控制采购:管理采购关系、监督合同执行情......
  • Vue3学习笔记(1)
    安装//使用yarn构建//安装yarn需要管理员权限sudonpmiyarn-gyarncreatevitecd..yarnyarndev目录结构见名知义四种......
  • SpringCloud 源码学习笔记2——Feign声明式http客户端源码分析
    系列文章目录和关于我一丶Feign是什么Feign是一种声明式、模板化的HTTP客户端。在SpringCloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一一样的......
  • 【Redis 系列】redis 学习九,Redis 的发布和订阅是咋玩的
    Redis发布订阅Redis发布订阅(pub/sub)是一种消息通信模式发送者发送消息pub接受者订阅消息sub例如微信,微博这样的关注系统Redis的客户端可以订阅任意数量的频......
  • Java 正则表达式详解
    总结:搜索(匹配):在一个字符串中搜索出一个或多个与正则表达式相匹配的子字符串。搜索又分为匹配和子字符串搜索。匹配是对用户所提供的整个字符串进行判断,看其是否匹......
  • 深入理解JVM学习笔记
    Java虚拟机内存区域:[2.2]运行时数据区域:1.程序计数器2.Java虚拟机栈3.本地方法栈4.Java堆5.方法区6.运行时常量池7.直接内存[2.3.1]对象的创建在虚拟机中,当......
  • java swing创建一个窗口
    新建一个窗口类packagecom.rzk;importjavax.swing.*;importjava.awt.*;publicclassSwingFrameextendsJFrame{JLabellabel=newJLabel("输入名");......
  • Jetpack Compose学习(11)——Navigation页面导航的使用
    原文:JetpackCompose学习(11)——Navigation页面导航的使用-Stars-One的杂货小窝在Android原生的View开发中的,也是有Navigation,原生我之后可能再出篇教程,今天讲解......
  • C#初步学习1(个人笔记,基于老赵.Net的视频自学,不喜勿喷)
    //此笔记仅针对个人学习而写,会有所缺失的内容,不喜勿喷初步学习创建文件这里使用VisualStudio编写C#代码安装其中一个运行平台,创建新项目至于名字那就起每一个码农的......