JAVA-线程

news2024/11/27 8:46:01

        先上图,有点长,比较碎,有xmind文件......,详细内容均在图片里介绍了,提供了PDF文件

1.线程简介 

        进程是操作系统中正在执行的不同的应用程序,例如:我们可以同时打开Word和记事本

        线程是一个应用程序进程中不同的执行路径。进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。

        进程是线程的容器。一个进程可以有多个线程,至少有一个线程。而一个线程只能在一个进程的地址空间活动

2.多线程的三种实现方式

3.线程常用方法

3.1.Thread

//Thread
public class MyThread extends Thread{

    @Override
   public void run(){
        for (int i = 0; i < 10; i++) {
            System.out.println(getName() + "run方法里的函数");
        }
   }



}
//创建开启线程
public abstract class ThreadDemo {
    public static void main(String[] args) {
        // 创建 MyThread 类的实例
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.setName("线程1");
        t2.setName("线程2");
        // 启动线程
        t1.start();
        t2.start();
    }
}

3.2.Runnable

//Runnable
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        //获取当前线程的对象
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName() + "MyRunnable.run方法实列");
    }
}

//创建开启线程
public class ThreadDemo {
    public static void main(String[] args) {
    /*
    * 多线程的第二中启动方式:
    * 1.自己定义一个类实现Runnable方法
    * 2.重写里面的run方法
    * 3.创建自己的类的对象
    * 4.创建一个Thread类的对象,并开启线程
    * */
        MyRunnable myRunnable = new MyRunnable();
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);
        thread1.setName("线程1");
        thread2.setName("线程2");
        thread1.start();
        thread2.start();


    }
}

3.3.Callable

//Callable
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {

        return 100;
    }
}
//第三种方式
public class ThreadDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /*
        *多线程的第三种是实现方式
        *   特点:可以获取到多线程运行的结果
        *   1、创建一个类MyCallable实现Callable接口
        *   2、重写call方法(有返回值的,表示多线程运行的结果)
        *   3、创建MyCallable的对象(表示多线程要执行的任务)
        *   4、创建FutureTalk的对象(作用是管理多线程运行的结果)
        *   5、创建Thread类的对象,并启动(表示线程)
        * */

        //创建MyCallable的对象(表示多线程要执行的任务)
        MyCallable myCallable = new MyCallable();
        //创建FutureTalk的对象(作用是管理多线程运行的结果
        FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
        //创建对象
        Thread thread = new Thread(futureTask);
        //启动线程
        thread.start();
        //获取多线程运行的结果
        Integer i = futureTask.get();
        System.out.println(i);
    }
}

4.锁

锁是一种同步机制,可以用来协调多个线程的并发访问,以保证对共享资源的安全访问。可以理解为防止一件东西同时被多个人使用。用于保护线程安全的一种机制。 

4.1.synchronized锁

  static int ticket = 0;

    @Override
    public void run() {
        while (true) {
            synchronized (MyThread.class) {
                if (method()) break;
            }
        }

    }

    private synchronized boolean method() {
        if (ticket < 99){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            ticket++;
            System.out.println(Thread.currentThread().getName() + "正在卖第 " + ticket + "票!");


        }else{
            return true;
        }
        return false;
    }

4.2.lock锁

public class MyThread extends Thread {

    static int ticket = 100;

    static Lock lock = new ReentrantLock();

    @Override
    public void run() {

        /*
         * Lock实现提供比使用sunchronized方法和语句更广泛的锁定操作
         * lock中提供了获得锁和释放锁的方法
         * void lock():获得锁
         * void unlock():释放锁
         *
         * Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
         * ReentrantLock的构造方法
         *
         * ReentrantLock():创建一个ReentrantLock的实例
         *
         * */

        while (true) {
            //同步代码块,lock上锁
            lock.lock();
            if (ticket == 100){
                break;
            }else {

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }finally {
                    //释放锁
                    lock.unlock();
                }
                ticket++;
                System.out.println(Thread.currentThread().getName() + "在卖第" + ticket);
            }

        }



    }
}

4.3.死锁

详细介绍可看开头的图片

5.生产者和消费者问题

5.1.线程的等待和唤醒

public class Desk {

    /*
    * 控制生产者和消费者的执行
    * */

    //是否有面条 0:没有 1:有
    public static int foodFlag = 0;

    //总个数
    public static int count =10;

    //锁对象
    public static Object lock = new Object();
}

//消费者
public class Cook extends Thread {
    /*
    * 消费者
    * */
    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock){
                if(Desk.count == 0){
                    break;
                }else{
                    //判断桌子上是否有食物
                    //如果有就等待,没有就唤醒
                    if(Desk.foodFlag == 1){
                        try {
                            //等待
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }else{
                        System.out.println("厨师做了一碗面条");
                        //修改桌子状态
                        Desk.foodFlag = 1;
                        //唤醒
                        Desk.lock.notifyAll();
                    }
                }

            }

        }
    }
}
//生产者
public class Foodie extends Thread {
    /*
    生产者
    * */
    @Override
    public void run() {
        /*
        * 1.循环
        * 2.同步代码块
        * 3.判断共享数据是否到了末尾(到了末尾)
        * 4.判断共享数据是否到了末尾(没有到达末尾,执行核心逻辑)
        *
        * */
        while (true) {
            synchronized (Desk.lock){
                //先判断桌子上是否有面条
                if(Desk.count == 0){
                    break;
                }else{
                    if(Desk.foodFlag == 0){
                        //如果没有
                        try {
                            Desk.lock.wait();//让当前线程和锁进行绑定
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }else{
                        //把吃的总数-1
                        Desk.count--;
                        //如果有就开吃
                        System.out.println(Desk.count + "碗!!!");
                        //吃完之后,唤醒厨师继续做
                        Desk.lock.notifyAll();
                        //修改桌子的状态
                        Desk.foodFlag = 0;
                    }

                }
            }

        }

    }
}

5.2.阻塞队列

public class ThreadDemo {
    public static void main(String[] args) {
       /*
        * 阻塞队列的继承结构
        * 接口:Iterable
        *      Collection
        *      Queue
        *      BlockingQueue
        * 实现类L:ArrayBlocking : 数组 ,有界
        *        LinkedBlockingQueue:底层是链表,无界,但不是真正的无界,最大为int的最大值+
        *
        * */
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);
        Cook cook = new Cook(queue);
        Foodie foodie = new Foodie(queue);
        cook.start();
        foodie.start();
    }
}

6.线程池

        线程池是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。

6.1.ExecutorService

public class MyThreadPoolDemo {
    public static void main(String[] args) {

        /*
        public static ExecutorService newCachedThreadPool()    创建一个没有上限的线程池
        public static ExecutorService newFixedThreadPool(int nThread)    创建有上限的线程池
        */
        //1.获取线程池对象,池子本身是空的,提交任务的时,池子会创建新的线程对象,
      // 任务执行完毕,线程归回给池子,下回再次提交任务时,不需要创建新的线程,直接复用已有的线程
        ExecutorService pool = Executors.newCachedThreadPool();
        ExecutorService pool1 = Executors.newFixedThreadPool(3);
        //提交任务
        pool.submit(new MyRunnable());
        pool.submit(new MyRunnable());
        //销毁线程池
        pool.shutdown();
    }

6.2.ThreadPoolExecutor

public class ThreadPool {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3,
                6,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(2),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        threadPoolExecutor.submit(new MyRunnable());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1833364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建型模式--抽象工厂模式

产品族创建–抽象工厂模式 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题。 但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个“产品族”,…

C#聊天室②

客户端 桌面 MyClient client;public Form1(){InitializeComponent();}// 进入聊天室按钮方法private void button1_Click(object sender, EventArgs e){if (!string.IsNullOrEmpty(textBox1.Text)){// 开始连接服务器 封装一个自定义客户端类client new MyClient(); // 给cl…

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…

免费无版权可商用资源|自媒体创业者、设计师、电商商家必备

1.前言 小伙伴们大家好&#xff0c;欢迎来到天夏Ai&#xff0c;这里专注于分享人工智能精品资源&#xff1a;Ai副业项目、Ai效率神器&#xff01;和你一起共享Ai信息&#xff0c;分享Ai副业项目资源&#xff0c;开启智能副业赚钱新时代&#xff01; 今天为大家分享免费无版权可…

Spring Cloud Nacos 详解:服务注册与发现及配置管理平台

Spring Cloud Nacos 详解&#xff1a;服务注册与发现及配置管理平台 Spring Cloud Nacos 是 Spring Cloud 生态系统中的一个子项目&#xff0c;提供了服务注册与发现、配置管理等功能&#xff0c;基于 Alibaba 开源的 Nacos 项目。Nacos 是一个易于使用的动态服务发现、配置管…

AI存储解决案例分享

AI数据管道&#xff08;Data Pipeline&#xff09;是指在AI项目中&#xff0c;数据从原始状态到最终可用模型的整个处理流程&#xff0c;包括数据采集、清洗、转换、分析、训练模型、验证模型直至部署和监控等多个环节。 在AI训练和推理过程中&#xff0c;多个管道可能同时读取…

企业社会责任认证:提升品牌价值的关键

社会责任认证&#xff08;Social Responsibility Certification&#xff09;是现代企业在经营过程中主动履行社会责任、尊重人权、保护环境等方面所获得的认证。这不仅是企业管理的要求&#xff0c;更是企业赢得社会信任和支持的关键。 社会责任认证是企业在经营过程中&#xf…

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选

一、目的&#xff1a;在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框&#xff0c;勾选本节点的同时也要同步显示父节点和子节点状态 二、实现 三、环境 VS2022 四、示例 定义如下节点类 public partial class TreeNodeBase<T> : SelectBindable<…

基于Java技术“漫画之家”系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构&#xff0c;SpringBoot框架 工具&#xff1a;MyEc…

【机器学习300问】122、RNN面临哪些问题?

循环神经网络&#xff08;RNN&#xff09;主要面临梯度消失和梯度爆炸两个核心问题&#xff0c;这严重影响了其处理长期依赖的能力。此外&#xff0c;还存在一些其他的技术挑战。 一、两个主要问题 &#xff08;1&#xff09;梯度消失和梯度爆炸问题 这是RNN中最显著的问题之…

⭐ ▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch3 贝尔曼最优公式 【压缩映射定理】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、过 电子书&#xff0c;补充 【下载&#xff1a;本章 PDF 电子书 GitHub 界面链接】 [又看了一遍视频] 3、总体 MOOC 过一遍 习题 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链…

【蜂窝物联】物联网智能控制器助力各种自动化控制领域科学管控

【蜂窝物联】4G远程温湿度传感器科学管理利器&#xff0c;应用无处不在 2024-06-17 14:09 发布于&#xff1a;福建省 随着信息化的不断推进&#xff0c;对各行各业都是一次现代化升级的契机&#xff0c;比如工厂的温湿度监测工作&#xff0c;完全可以由无线温湿度监控方案…

C#知识|模块化分层学习笔记

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 01 基本分层 典型的两层结构&#xff1a;由UI层 数据访问层 实体类构成。 其中实体类不算一层&#xff0c;本质是一个数据载体。 02 模块化分层 模块概念&#xff1a;在.NET平台中&#xff0c;模块主要是指类库项目。…

AI时代的数据治理:挑战与策略

随着人工智能&#xff08;AI&#xff09;技术的突飞猛进&#xff0c;我们已迈进智能时代的大门。在这个新时代里&#xff0c;数据无疑成为推动AI创新与进步的核心力量。然而&#xff0c;与此同时&#xff0c;数据治理的紧迫性也日益凸显&#xff0c;它成为确保AI系统有效、公正…

晨持绪科技:抖音开网店能不能赚钱

在当今社交媒体时代&#xff0c;抖音作为一款流行的短视频平台&#xff0c;不仅为用户提供了展示才艺、分享生活的空间&#xff0c;也逐渐成为电子商务的新兴战场。不少商家和个人通过开设抖音网店寻求盈利机会。 抖音网店的赚钱可能性与多个因素密切相关。它提供了一个庞大的潜…

英特尔 “AI” 科通:英特尔AI大模型应用前瞻

亲爱的科技探险家、前沿探索者、对未来深具好奇心的您&#xff0c; 身处人工智能引领的时代&#xff0c;我们目睹着行业的革命性变革。技术的创新不仅改变着我们的日常&#xff0c;更重新定义着我们对未来的期许。今天&#xff0c;怀着无限激情和期待&#xff0c;我们邀请您参…

全面了解三大 AI 绘画:Midjourney、Stable Diffusion、DALL·E 的区别和特点

大家好&#xff0c;我是设计师阿威 在当前&#xff0c;比较流行的 AI 绘画软件主要有三个&#xff0c;分别是&#xff1a;StabilityAI 公司的 Stable Diffusion&#xff0c;OpenAI 公司的 DALLE2&#xff0c;以及更为大众所熟知的&#xff0c;Leap Motion公司创始人 David Hol…

2024年6月10日~2024年6月16日周报

文章目录 一、前段时间工作二、完成情况2.1 可变形卷积的学习2.1.1 Introduction-介绍2.1.2 Related Work-相关工作2.1.3 Method-方法2.1.3.1 可变形卷积动态属性的重认识2.1.3.2 Speeding up DCN—加速DCN 2.2 部署可变形卷积 三、假期计划 一、前段时间工作 在之前一段时间主…

【多视图感知】BEVFormer: Learning Bird’s-Eye-View Representation

BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers 论文链接:http://arxiv.org/abs/2203.17270 代码链接:https://github.com/fundamentalvision/BEVFormer 一、摘要 本文提出了一种名为BEVFormer的新框架&am…

Marin说PCB之orcad-capture原理图封装库的创建总结----01

今天是个不错的日子&#xff0c;我早上一出门刚骑车到半路就开始下大雨了&#xff0c;可是天气预报上明明说的没有雨啊&#xff0c;所以说天气预报就像是女人的脾气一样&#xff0c;难以揣摩啊&#xff0c;也尽量少去揣摩吧。 小编我刚刚到公司&#xff0c;就收到美国分部同事J…