(JAVA)线程

线程的创建

方式一:Thread
public class dome {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        for(int i=1;i<=5;i++){
            System.out.println("主线程"+i);
        }
    }
}
public class MyThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<5;i++){
            System.out.println("MyThread线程"+i);
        }
    }
}
方式二:Runnable
public class dome {
    public static void main(String[] args) {
        Runnable r = new MyRunnable();
        new Thread(r).start();
        for(int i=1;i<=5;i++){
            System.out.println("主线程"+i);
        }
    }
}
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for(int i=1;i<=5;i++){
            System.out.println("MyRunnable"+i);
        }
    }
}

方式三:Callable

public class dome {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //3.创建一个Callable对象
        Callable c = new MaCallable(100);
        //4.把Callable对象封装成一个FutureTask对象(任务对象)
        FutureTask<String> f = new FutureTask<>(c);

        //作用
        //1.是一个任务对象,实现了Ruuable类
        //2.可以用get()方法获取任务执行完后的结果
        new Thread(f).start();

        //获取执行完之后的结果
        //如果此时还未执行完,则在此等待
        String s = f.get();
        System.out.println(s);
    }
}
//1.实现Callable接口
public class MaCallable implements Callable<String> {
    private int n;
    public MaCallable(int n){
        this.n=n;
    }
    //2.重写call方法

    @Override
    public String call() throws Exception {
        int sum=0;
        for(int i=1;i<=n;i++){
            sum+=i;
        }
        return "1-"+n+"的和为:"+sum;
    }
}

Thread常用方法

public class dome {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Thread t1 = new MyThread("1号");
//        t1.setName("1号");//设置线程名称
        t1.start();

        Thread t2 = new MyThread("2号");
//        t1.setName("2号");
        t2.start();

        Thread t = Thread.currentThread();
        for(int i=1;i<=5;i++){
            System.out.println(t.getName()+"线程"+i);
        }
    }
}
public class MyThread extends Thread{
    public MyThread(String name){
        super(name);
    }
    @Override
    public void run() {
        Thread t = Thread.currentThread();//用来获取线程名称
        for(int i=0;i<5;i++){
            System.out.println(t.getName()+"线程"+i);
        }
    }
}

 

public class dome {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        for(int i=1;i<=5;i++){
            if(i==3){
                //休眠5秒
                Thread.sleep(5000);
            }
            System.out.println(i);
        }

        //join:让当前线程先跑完
        Thread t1 = new MyThread("1号");
        t1.start();
        t1.join();
        
        Thread t2 = new MyThread("2号");
        t2.start();

        Thread t3 = new MyThread("3号");
        t3.start();
        t2.join();
    }
}

线程同步

线程安全

线程同步的几种方式
1.同步代码块 (比2好)
    public void dr(int n) {
        String name = Thread.currentThread().getName();
        synchronized (this) {
            //实力方法建议用this,静态方法建议用。class
            if(n<=num){

                System.out.println(name+"取钱"+n);
                num-=n;
                System.out.println(name+"剩"+num);
            }
            else {
                System.out.println(name+"不足");
            }
        }
    }
2.同步方法(可读性好)
 public synchronized void dr(int n) {
        String name = Thread.currentThread().getName();
            if(n<=num){

                System.out.println(name+"取钱"+n);
                num-=n;
                System.out.println(name+"剩"+num);
            }
            else {
                System.out.println(name+"不足");
            }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S知识点(十)

&#xff08;1&#xff09;Pod详解-启动命令 创建Pod&#xff0c;里面的两个容器都正常运行 &#xff08;2&#xff09;Pod详解-环境变量 &#xff08;3&#xff09;Pod详解-端口设置 &#xff08;4&#xff09;Pod详解-资源配额 修改&#xff1a;memory 不满足条件是不能正常…

第27章_事务原理之MVCC与锁机制

文章目录 MVCCread view聚集索引的隐藏列事务的可见性问题快照读当前读 redologundolog锁机制锁类型共享锁&#xff08;S&#xff09;排他锁&#xff08;X&#xff09;意向共享锁&#xff08;IS&#xff09;意向排他锁&#xff08;IX&#xff09;锁的兼容性 锁算法锁兼容关于锁…

Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2)

By: Ailson Jack Date: 2023.11.12 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/163.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

小程序中如何设置门店信息

小程序是商家转型升级的利器&#xff0c;小程序中门店信息的准确性和完整性对于用户的体验和信任度都有很大的影响。下面具体介绍门店信息怎么在小程序中进行设置。 在小程序管理员后台->门店设置处&#xff0c;可以门店设置相关。主要分为2个模块&#xff0c;一个是门店级…

AD教程 (十三)常见CHIP封装的创建

AD教程 &#xff08;十三&#xff09;常见CHIP&#xff08;贴片&#xff09;封装的创建 PCB封装是电子设计图纸和实物之间的映射体&#xff0c;具有精准数据的要求&#xff0c;在实际设计中需要通过规格书获取创建封装的数据参数。 PCB封装和实物的大小一致。PCB封装是承载实物…

Linux进程的认识与了解[上]

文章目录 1.何为进程?1.1对进程的认识1.2基本概念 2.OS如何管理大量进程?2.1图解2.2进程的形成 3.何为PCB?3.1对PCB的认识3.2task_ struct内容分类3.2对进程表的认识 4.查看进程4.1基础指令4.2获取某进程的PID(process id)4.3杀死进程4.4获取当前进程的父进程的ppid(parent …

Vant 移动端UI

Vue项目中安装Vant # Vue 3 项目&#xff0c;安装最新版 Vant npm i vant 组件按需引入配置 Vant按需引入- - -安装&#xff1a;unplugin-vue-components 插件 unplugin-vue-components 插件可以在Vue文件中自动引入组件&#xff08;包括项目自身的组件和各种组件库中的组件&…

RK3568平台开发系列讲解(Linux系统篇)Linux 目录结构

🚀返回专栏总目录 文章目录 一、VFS二、分区结构三、挂载 mount四、目录结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们从目录管理入手,会更直观的理解 linux 的目录结构。 一、VFS Linux 所有的文件都建立在虚拟文件系统(Virtual File System ,VFS…

事件循环Eventloop

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有…

【Devchat 插件】创建一个GUI应用程序,使用Python进行加密和解密

VSCode 插件 DevChat——国内开源的 AI 编程&#xff01; 写在最前面DevChat是什么&#xff1f;什么是以提示为中心的软件开发 &#xff08;PCSD&#xff09;&#xff1f;为什么选择DevChat&#xff1f;功能概述情境构建添加到上下文生成提交消息提示扩展 KOL粉丝专属福利介绍D…

【原创课设】java+swing+mysql选课管理系统设计与实现

摘要&#xff1a; 随着学校规模的扩大和课程设置的多样化&#xff0c;传统的手工选课管理方式已经无法满足现代教育的需求。因此&#xff0c;开发一款高效、便捷的选课管理系统变得尤为重要。该系统可以提高选课工作的效率&#xff0c;减少人为错误&#xff0c;同时也能为学生…

linux循环继续fordodone数值处理和脚本的追踪调试

格式 for &#xff08;&#xff08;初始值&#xff1a;限制值&#xff1b;步长&#xff09;&#xff09; do 程序段 done 注意点&#xff1a;$(()) 数值运算 $()命令 ${}取值 sh [-nvx] *.sh -n 不执行脚本&#xff0c;检查语法错误-常用 -v 执行之前&#xff0c;将…

Windows server 2008 R2 IIS搭建ASP网站教程

一、安装应用程序服务器 提示安装成功 二、添加角色服务asp 三、asp网站配置 放入源码 设置网站首页为index.asp: 设置应用程序池 四、设置网站目录属性 五、access数据库连接配置 Cd c:\Windows\System32\inetsrv appcmd list apppool /xml | appcmd set apppool /…

华为防火墙基本原理工作方法总结(包含源进源出)

两台防火墙在规划接口时一般2台防火墙的业务口相同&#xff0c;心跳口相同&#xff0c;这个上是基础&#xff0c;例如&#xff1a;第一台防火墙业务口用了g1/0/1口&#xff0c;那第二台防火墙业务口也得是这个g1/0/1口。 防火墙只会对tcp首包syn建立会话表&#xff0c;其它丢掉…

【Redis系列】Redis上设置key,value的时候出现NOAUTH Authentication required提示如何解决?

哈喽&#xff0c;大家好&#xff0c;我是小浪。相信大家在初学一门新的知识点的时候都会遇到各种各样的问题&#xff0c;在网上找了一大堆的解决方案&#xff0c;最后还是无功而返&#xff0c;那么今天博主就记录一下在进行Redis的一些操作中遇到的问题~ 当我们好不容易安装好R…

js案例:打地鼠游戏(打灰太狼)

效果预览图 游戏规则 当灰太狼出现的时候鼠标左键点击灰太狼加10分&#xff0c;小灰灰出现的时候鼠标左键点小灰灰击减10分&#xff0c;不点击不减分不加分。 整体思路 1.把获取背景图片中每个地洞的位置&#xff0c;把所有位置放到一个数组中。 2.封装随机数函数&#xff0c;随…

Tomcat学习

一、入门 在webapp里面必须先创建一个文件夹&#xff0c;文件夹里面放的内容&#xff0c;才会被访问到。 创建一个javaweb项目后

【狂神说Java】Nginx详解

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

推荐系统笔记--基于物品的协同过滤(Item CF)

1--基本原理 Item CF的原理是根据物品的相似度来将新的物品推荐给用户&#xff1b;下图中用户对红色物品的感兴趣度为 [2, 1, 4, 3]&#xff0c;红色物品与橙色物品的相似度为 [0.1, 0.4, 0.2, 0.6]&#xff0c;因此可以计算出用户对橙色物品的感兴趣度。 Item CF的基本思想是&…

探寻知识的新路径——电大搜题助您开启学习新纪元

江西开放大学和广播电视大学一直以来都是许多自学者和职场人士追寻知识的圣地。然而&#xff0c;对于许多学子来说&#xff0c;学习的过程也常常充满了困惑和挑战。为了帮助这些学习者通过更高效、便捷的方式获取知识&#xff0c;江西开放大学推出了一款创新的学习工具——电大…
最新文章