java学习--线程基础

news2024/9/27 8:19:41

概念

程序

进程

线程

单线程与多线程

并发与并行

线程基本使用

基成Tread类

关系图


/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class Main {
    public static void main(String[] args) throws InterruptedException {
        Cand cand = new Cand();
        cand.start();
        int i=0;
        while (true){
        System.out.println("主线程启动"+Thread.currentThread().getName());
        i++;
        Thread.sleep(1000);

        if (i==6)
        break;}

    }
}
class Cand extends Thread {
    @Override
    public void run() {

        int time=0;
        while (true) {
            System.out.println("小猫叫");
            time++;

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (time==8)
                break;

        }
    }
}

主线程结束了,子线程没结束那么应用程序就不会结束,除非所有的线程都结束了,应用程序才会结束,并且主线程和子线程会交替进行,不会阻塞,并且使用start方法开始线程他会主动调用run方法,之所以如此原因如下

,并且这样直接调用那么线程就只是main,并且会按照程序进行先进行调用run()方法内的内容,再进行后面的内容

start()启动线程的过程

实现接口Runnable

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class Test01 {
    public static void main(String[] args) {
        Roud roud = new Roud();
        //无法像继承Thread类时可以直接调用start方法启动线程
       // roud.start();
        Thread thread = new Thread(roud);
        thread.start();

    }
}
class Roud implements Runnable {

    @Override
    public void run() {
        int i=0;
        while (true) {


        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("小狗叫了" + Thread.currentThread().getName());
        i++;
        if (i==10)
            break;
    }
}
}

使用这个方式实现调用start方法启动线程是用到了代理模式。我们可以来模拟一下

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class Test02 {
    public static void main(String[] args) {
        Roud_ roud_ = new Roud_();
        PoxyTread poxyTread = new PoxyTread(roud_);
        poxyTread.start();

    }
}

class PoxyTread implements Runnable{
   private Runnable runnable=null;

    public PoxyTread(Runnable runnable) {
        this.runnable = runnable;
    }

    @Override
    public void run() {
        if (runnable!=null)
            runnable.run();
        

    }
    public void start()
    {
        start0();
    }
    public void start0()
    {
        run();
    }

}
class Roud_ implements Runnable {
    @Override
    public void run() {
        int i = 0;
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("小狗叫了" + Thread.currentThread().getName());
            i++;
            if (i == 10)
                break;
        }
    }
}
多线程执行

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class Test03 {
    public static void main(String[] args) {
        T1 t1 = new T1();
        T2 t2 = new T2();
        Thread thread = new Thread(t1);
        Thread thread1 = new Thread(t2);
        thread.start();
        thread1.start();


    }
}
class T1 implements Runnable{

    @Override
    public void run() {
        int i=0;
        while (true)
        {
        System.out.println("mimi"+Thread.currentThread().getName());
        i++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (i==10)
                break;
        }
    }
}
class T2 implements Runnable{

    @Override
    public void run() {
        int i=0;
        while (true)
        {
            System.out.println("mimi"+Thread.currentThread().getName());
            i++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (i==10)
                break;
        }
    }
}

继承Thread与Runnable的区别

线程终止

线程常用方法

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class test05 {
    public static void main(String[] args) throws InterruptedException {
        T_ t = new T_();
        Thread thread = new Thread(t);
        thread.start();

        for(int i=0;i<5;i++)
        {
            Thread.sleep(1000);
            System.out.println("hi"+i);
        }
        thread.interrupt();

    }
}
class T_ implements Runnable{

    @Override
    public void run() {
        while (true)
        {
            for(int i=0;i<100;i++)
            {
                System.out.println("吃包子"+i);
            }
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName()+"被中断了");
            }
        }
    }
}

如果没有interrupt的话,应该再输出5个hi后再到达睡眠时间sleep(20000)后又开始输出吃包子语句,

有了之后他直接干预了休眠时间,直接就会打印出被干预的话,然后立刻开始又打印吃包子

解析1:

例如当一个cpu在并发运行两个线程时,其中一个使用了yield让CPU先去出里另一个。但是如果CPU他是能同时兼顾这两个的时候,那么yield就不会使用成功

解析2:

例如当一个cpu在并发运行两个线程时,再运行一个线程时,另一个线程使用了join,那么就会先运行完另一个线程的内容,才会再运行这个

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class test06 {
    public static void main(String[] args) throws InterruptedException {
        T_i t = new T_i();
        Thread thread = new Thread(t);
        thread.start();

        for(int i=0;i<20;i++)
        {
            System.out.println("小弟吃包子"+i);
            Thread.sleep(1000);
            if (i==5)
                thread.join();
        }

    }
}
class T_i implements Runnable{

    @Override
    public void run() {
        int i=0; 
        while (true)
        {


                System.out.println("老大吃包子"+(++i));

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            if (i==20)
                break;
        }
    }
}

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
1.主线程每隔1s,输出hi,一共10次
2. 当输出到hi 5时,启动一个子线程(要求
实现Runnable),每隔1s输出hello,等
该线程输出10次 hello后,退出

3.主线程继续输出hi,直到主线程退出.
4.如图,完成代码
*/public class Test07 {
    public static void main(String[] args) throws InterruptedException {
        T_O t_o = new T_O();
        Thread thread = new Thread(t_o);
      // thread.start();
        for(int i=0;i<10;i++)
        {
            System.out.println("hi"+i);
            Thread.sleep(1000);
            if (i==4) {
                thread.start();
                thread.join();
            }


        }
    }
}
class T_O implements Runnable{

    @Override
    public void run() {
        int i=0;
        while (true)
        {
            System.out.println("hello"+(++i));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            if (i==10)
                break;

        }
    }
}
用户线程和守护线程

线程的生命周期

7大状态

查看状态方式

线程同步

Synchronized

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class Test04 {
    public static void main(String[] args) {
        sell01 sell01 = new sell01();

        Thread thread = new Thread(sell01);
        Thread thread1 = new Thread(sell01);
        Thread thread2 = new Thread(sell01);
        thread.start();
        thread1.start();
        thread2.start();

    }
}

class sell01  implements Runnable{
    static int tick=100;
    boolean loop=true;
    public synchronized void sell(){
        if (tick<=0)
        {
            System.out.println("票已卖完");
            loop=false;
            return;
        }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("出售票"+Thread.currentThread().getName()+"剩余"+(--tick));

    }


    @Override
    public void run() {
        while (loop)
        {
            sell();




        }


    }
}


使用完美解决之前卖票不够了还卖的境界

锁在对象上,随机一个线程去拿这个锁打开进入操作相应的操作,然后出来再关闭,然后又随机一个来拿这个锁重复之前的步骤

互斥锁

是因为使用时会都堵塞在这,谁拿到锁谁才能进入执行操作,所以效率低了

注意事项

如果是这样就锁不住了。因为在创建时,都是new了个新对象,那么this指的对象每次都不一样

除了用this也可以用其他对象,只要是三个线程同一的对象就行,比如图上的Object,他是创建在该类的属性,所以三个线程对应的是同一个object对象

死锁

结果就是卡住了死锁

释放锁

import java.util.Scanner;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class test08 {
    public static void main(String[] args) {
        C c = new C();
        new Thread(c).start();
        B b = new B(c);
        new Thread(b).start();


    }
}
    class C implements Runnable{
       static boolean loop=true;

        public static void setLoop(boolean loop) {
            C.loop = loop;
        }

        @Override
        public void run() {
           while (loop){

                System.out.println((int)(Math.random()*100+1));
               try {
                   Thread.sleep(10000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }


           }

        }
    }
    class B implements Runnable{
        C a;//想要控制C就得有C对象

        public B(C a) {
            this.a = a;
        }

        Scanner scanner=new Scanner(System.in);

        @Override
        public void run() {
            while (true)
            {
                System.out.println("请输入你的字母");
                char c=scanner.next().toUpperCase().charAt(0);
                System.out.println(c);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {

                }
                if (c=='G')
                {  a.setLoop(false);//改变C控制循环的变量
                    break;
               }




            }

        }
    }

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
)有2个用户分别从同一个卡上取钱(总额:10000)
2)每次都取1000,当余额不足时,就不能取款了
3)不能出现超取现象=》线程同步问题.
*/public class Test09 {
    public static void main(String[] args) {
        new Car().run();
        new Car().run();

    }
}
class Car extends Thread{
    static int cash=10000;
    public synchronized void m()
    {
        while (cash!=0)
        {
            cash-=1000;
            System.out.println("还剩"+cash);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }

    @Override
    public void run() {
       m();
    }
}

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

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

相关文章

【Android Git】Android项目版本由SVN变成Git

前言 在Android开发环境中&#xff0c;vcs.xml 文件通常与版本控制系统&#xff08;VCS&#xff0c;Version Control System&#xff09;有关&#xff0c;这个文件保存了与版本控制系统相关的配置信息。 以下是 vcs.xml 文件的一些关键点&#xff1a; 版本控制配置&#xff…

Cryptomator-保护你云端上的隐私

网盘为我们提供了随时随地的获取数据的便利性&#xff0c;同时也大大减轻了你我手机电脑空间不足的压力。但是一旦我们选择使用网盘&#xff0c;也意味着把你的私密数据交出去了。 对于公共资料来说&#xff0c;无非就是提供网盘服务的公司知道了你做了保存这些资料的行为而已…

提升用户体验的秘诀:Xinstall带你玩转Web拉起App!

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地触达和使用App&#xff0c;成为了开发者和运营者面临的一大挑战。今天&#xff0c;我们就来揭秘一个能够一键实现Web拉起App的神器——…

类和对象(下)C++

1.初始化列表 1.为什么有初始化列表&#xff0c;它的作用&#xff1f; ->初始化列表&#xff0c;是构造函数初始化的另一种形式。 ->在语法上面理解&#xff0c;初始化列表可以认定为是每个成员变量定义初始化的地方. ->引用成员变量&#xff0c;const成员变量&am…

100个免费可商用图库,一次收藏,众生受益

正版图片太贵 免费图片又有风险 免费可商用图片才是设计师心头所好 &#xff08;当然&#xff0c;土豪除外&#xff09; 以下100个免费可商用图库 一次收藏&#xff0c;众生受益! skr&#xff5e;skr&#xff5e;skr&#xff5e; 1、Unsplash https://unsplash.com/ 建…

6个免费的无损音乐下载网站,建议收藏!

分享6个免费的无损音乐下载网站&#xff0c;都是免费的音乐资源&#xff0c;国内外各种风格的音乐都能找到&#xff01; MyFreeMP3 tools.liumingye.cn/music/ 一个免费的mp3音乐下载网站&#xff0c;里面有丰富的音乐资源&#xff0c;支持在线听歌&#xff0c;也可以下载歌…

找出电脑中的视频文件并把地址输出在记事本文件中,同理通过bat脚本找出需要的其他后缀文件,比如word文件excel文件md文件等

下午的时候&#xff0c;突然很着急&#xff0c;要找到一个之前下载的一个视频文件&#xff0c;我记得是mp4格式的视频文件&#xff0c;但是具体叫什么名字不记得了&#xff0c;更不记得在哪个目录下&#xff0c;所以想了一个办法&#xff0c;通过bat脚本命令&#xff0c;找到所…

Hack The Box-Resource【更新中】

总体思路 信息收集&端口利用 nmap -sSVC itrc.ssg.htb目标开放了两个ssh端口和一个80端口&#xff0c;先查看80端口 网站是一个SSG IT资源中心&#xff0c;主要用于解决网站问题、管理 SSH 访问、清除病毒和解决各种安全问题的权威一站式商店。 后台挂着目录扫描&#x…

threejs加载fbx带tga贴图报错

描述&#xff1a;threejs加载带tga贴图的fbx时&#xff0c;提示 FBXLoader: TGA loader not found, creating placeholder texture for 11\Pylons_A.TGA 方案一&#xff1a; 加载fbx之前&#xff0c;在LoadingManager中添加TGALoader。此方案有两个前提 1、FBXLoader和TGALoa…

JDK-Java IO流概述

JDK-Java IO流概述 概述 一直以来Java三件套&#xff08;集合、io、多线程&#xff09;都是最热门的Java基础技术点&#xff0c;我们要深入掌握好这三件套才能在日常开发中得心应手&#xff0c;之前有编写集合相关的文章&#xff0c;这里出一篇文章来梳理一下io相关的知识点。 …

电商客服的贴心快捷回复助手

作为一位电商客服&#xff0c;你是否曾在回复顾客的过程中感到困扰&#xff1f;是否因为经验不足而踩过雷&#xff0c;比如被平台提示用了违禁词&#xff0c;或是不清楚平台的响应率和满意度等问题&#xff1f;如果是这样&#xff0c;那么今天我要向大家介绍一款神奇的软件&…

小白学算法之移除元素(双指针法!)

力扣27&#xff1a;移除元素 题目内容&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-游戏存储(结束!)

文章目录 分数储存写在最后 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船动画&#xff08…

制造知识普及(二)--企业内部物料编码(IPN)与制造商物料编码(MPN)

在日常的物料管理业务逻辑中&#xff0c;一物一码是物料管理的基本的业务规则&#xff0c;不管物料从产品开发还是仓库管理&#xff0c;甚至成本核算&#xff0c;都要遵循这个原则&#xff0c;才能保证产品数据的准确性&#xff0c;才具备唯一追溯的可行性。大部分企业都是这种…

OFD 发票解析

文章目录 参考文章1 了解ofd文件结构1.1 如何打开ofd 文件1.2 ofd文件结构1.3 提取信息思路 2. 提取发票信息实现2.1 目录结构2.2 实体类2.3 发票解析类2.4 controller2.5 service 参考文章 ofd发票解析 什么是ofd格式 ofd 格式是一种用于存储金融数据的开放格式&#xff0c;它…

SpringBoot3 配置Logback日志滚动文件

简介 本文介绍了在SpringBoot3中配置Logback日志滚动文件的方法&#xff0c;因为SpringBoot3内置的logback版本是1.4.14&#xff0c;之前使用SpringBoot2.1.5的logback配置发现有些东西不能生效了 环境 SpringBoot v3.3.2 内置的logback-core为1.4.14 正文 <configuration …

【预训练语言模型】 使用Transformers库进行BERT预训练

基于 HuggingFace的Transformer库&#xff0c;在Colab或Kaggle进行预训练。 鉴于算力限制&#xff0c;选用了较小的英文数据集wikitext-2 目的&#xff1a;跑通Mask语言模型的预训练流程 一、准备 1.1 安装依赖 !pip3 install --upgrade pip !pip install -U datasets !pi…

2024华数杯c题题解(一)

目录 原题背景 背景分析 问题一 思路 代码 问题二 思路 代码 原题背景 最近&#xff0c;“city 不 city”这一网络流行语在外国网红的推动下备受关注。随着我国过境免签政策的落实&#xff0c;越来越多外国游客来到中国&#xff0c;通过网络平台展示他们在华旅行的见闻…

如何利用virtuoso自动仿真占空比?

设计完一个振荡器&#xff08;OSC&#xff09;&#xff0c;我们有时候会仿真一下占空比&#xff0c;那么如何利用virtuoso软件的caculator功能自动获取呢&#xff1f; 开整&#xff01; 占空比是指在一个脉冲循环内&#xff0c;通电时间相对于总时间所占的比例。 我们在时钟上…