Java多线程(一些常用方法

今天学了一点多线程,感觉有点乱乱的

一.有三种方法可以实现多线程

1.继承Thread类;

直接继承Thread类,重写run方法

package a0415;
//第一种执行方法(继承Thread类的方法进行实现)
public class Test1 {public static void main(String[] args) {//继承Thread类,重写run方法MyThread t1=new MyThread();MyThread t2=new MyThread();t1.setName("线程1");t2.setName("线程2");//运行后能够看出来能够体现是随机交替执行t1.start();t2.start();}
}
package a0415;public class MyThread extends Thread{@Overridepublic void run() {//线程要做的事情for (int i = 0; i < 100; i++) {if(getName().equals("线程1")){System.out.println("我在执行线程1");}if(getName().equals("线程2")){System.out.println("我在执行线程2");}}}
}

2.实现Runnable接口;

package a0415;public class Test2 {public static void main(String[] args) {MyRunable mr=new MyRunable();//把任务传递给线程Thread t1=new Thread(mr);Thread t2=new Thread(mr);t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}
}
package a0415;public class MyRunable implements Runnable{@Overridepublic void run() {//书写线程需要执行的语句for (int i = 0; i < 100; i++) {Thread t=Thread.currentThread();//这个是一个静态方法能够知道现在是哪个线程在运行System.out.println(t.getName()+"运行的第"+i+"次。");}}
}

3.利用Callable接口和Future接口;

package a0415;
//利用Callable接口和Future接口实现
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Test3 {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建MyCallable的对象(表示多线程要执行的任务)MyCallable mc=new MyCallable();//管理多线程运行的结果(要把任务传进去得到结果)FutureTask<Integer> ft=new FutureTask<>(mc);//创建线程对象Thread t1=new Thread(ft);//启动线程t1.start();//获得线程结果Integer result= ft.get();//输出线程结果System.out.println(result);}
}
package a0415;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum=0;for (int i = 0; i <= 100; i++) {sum+=i;}return sum;}
}

 

 

二.常见的几个方法

1.休眠(刚学感觉可以用在我之前的ATM系统里面做那个输错密码之后要几分钟再重输那里)

package a0415;import java.util.Scanner;//休眠
public class Test4 {public static void main(String[] args) throws InterruptedException {int count=0;Scanner sc=new Scanner(System.in);System.out.println("请输入你的密码");while (true) {String password=sc.next();if(password.equals("12345")){System.out.println("你输入的密码正确");break;}else{count++;if(count==3){System.out.println("你已经连续三次输错密码请五秒后再试");Thread.sleep(12000);System.out.println("你可以重新输入你的密码了");}else{System.out.println("你的密码有误请再次输入你的密码");}}}}
}

但是运行的时候发现休眠的时候我还能不断输入我想输入什么就输入什么(暂时不知道怎么处理)

2.优先级

package a0415;
//优先级
public class Test5 {public static void main(String[] args) {MyRunable mr=new MyRunable();Thread t1=new Thread(mr,"汽车");Thread t2=new Thread(mr,"轮船");System.out.println(t1.getPriority());System.out.println(t2.getPriority());t1.setPriority(1);t2.setPriority(10);/*测试之后发现优先级低并不是说一定要等优先级高的运行完之后才能运行优先级只是一个概率,不是绝对的!!!!*/t1.start();t2.start();}
}

3.守护线程

package a0415;
//守护线程!!!final void setDaemon(boolen on)
public class Test6 {public static void main(String[] args) {MyThread6 t1=new MyThread6();MyThread602 t2=new MyThread602();t1.setName("女神");/*t2为备胎线程* 当其他非守护线程结束以后,守护线程就会陆续结束* 当t1执行完以后,t1就会告诉t2,你没有什么存在的必要了,在这个过程中t2还在运行所以t2还会运行一会*/t2.setName("备胎");t2.setDaemon(true);t1.start();t2.start();}
}
/*应用场景:
* 你在微信和别人聊天的同时给别人发了一个文件,然后你关闭聊天窗口
* 文件传输这个线程就会陆续结束,也就是备胎线程*/
package a0415;public class MyThread6 extends Thread{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(getName()+"@"+i);}}
}
package a0415;public class MyThread602 extends Thread{@Overridepublic void run() {for (int i = 0; i <= 100 ; i++) {System.out.println(getName()+"@"+i);}}
}

 

 

4.出让线程

package a0415;
//出让线程public static void yield()
public class Test7 {public static void main(String[] args) {MyRunable mr=new MyRunable();Thread t1=new Thread(mr,"汽车");Thread t2=new Thread(mr,"轮船");t1.start();t2.start();}
}
/*尽可能会让结果均匀一点,每执行一次都会抢一次但有可能还是上一次的那个抢到*/

5.插入线程

package a0415;
//插入线程
public class Test8 {public static void main(String[] args) throws InterruptedException {MyThread6 t=new MyThread6();t.setName("飞机");t.start();//把飞机线程插入到main线程之前,让t先运行完再运行main;t.join();for (int i = 0; i < 10; i++) {System.out.println("main线程"+i);}}
}

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

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

相关文章

​LeetCode解法汇总2924. 找到冠军 II

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 一场比赛中共有 n 支队伍&#xff0c;按从…

【云计算】安全组和网络ACL的区别

安全组和网络ACL的区别 ACL&#xff08;Access Control List&#xff09;和 安全组&#xff08;Security Group&#xff09;是两种不同的网络安全控制机制&#xff0c;通常用于管理云计算平台中的网络访问权限。它们在功能和实现上有一些显著的区别&#xff1a; 辨析 范围不同&…

数据库-Redis(16)

目录 76.新的主库选择出来后,如何进行故障的转移? 77.Redis事件机制? 78.Redis文件事件的模型? 79.什么是Redis发布订阅?

ASP.NET MVC企业级程序设计 (EF+三层架构+MVP实现查询数据)

目录 效果图 实现过程 1创建数据库 2创建项目文件 3创建控制器&#xff0c;右键添加&#xff0c;控制器 ​编辑 注意这里要写Home​编辑 创建成功 数据模型创建过程之前作品有具体过程​编辑 4创建DAL 5创建BLL 6创建视图&#xff0c;右键添加视图 ​编辑 7HomeContr…

【zookeeper】安装

第二次安装zookeeper了&#xff0c;蛮记录一下&#xff08;让blog丰富一点~&#xff09; 1. Apache Zookeeper官网下载 2. 解压后创建log和data文件夹 这个其实不一定要建在zookeeper文件夹下&#xff0c;建在任意一个文件夹里都行&#xff0c;只要配置文件中的路径配置能找到…

Spark面试整理-Spark部署和集群管理

Apache Spark的部署和集群管理是Spark应用的关键组成部分,它决定了如何在分布式环境中运行和管理Spark作业。Spark支持多种部署模式和集群管理器,以适应不同的需求和环境。以下是Spark部署和集群管理的主要方面: 部署模式 本地模式:在单个机器上运行Spark。适用于开发和测试…

软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程

1、概述 之前的文章本专题花了大量文字篇幅,介绍如何基于业务抽象的设计方式完成应用系统各个功能模块的设计工作。而之所以进行这样的功能模块设计无非是希望这些功能模块在具体的项目实施过程中,能够按照当时的需求快速的、简易的、稳定的、最大可能节约开发成本的形成可用…

图论-欧拉图

欧拉图是一种特殊的图,它具有一个有趣的性质:可以通过图中的一条路径访问图中的每一条边恰好一次,并且最终回到起点。这种路径被称为欧拉路径。如果图是连通的,则存在一条欧拉路径的图称为欧拉图。 欧拉图的判定算法基于以下定理: 定理:一个无向图是欧拉图,当且仅当该图中每个…

设计模式之观察者模式(上)

观察者模式 1&#xff09;概述 1.定义 定义对象之间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。 观察者模式的别名包括发布-订阅&#xff08;Publish/Subscribe&#xff09;模式、模型-视图&#…

PCB整理

1.加工工艺流程&#xff1a; 开料磨边 、烘板、内光成像、内层腐刻、内层AOI、内层黑化、层压、钻孔、沉铜加厚、外光成像、外层腐刻、外层AOI、印阻焊、阻焊成像、丝印字符、涂覆保护层、二次钻孔、外形加工、电测试、烘板包装。 2.层叠结构&#xff1a; 3.基材&#xff1a;覆…

开源模型应用落地-chatglm3-6b-gradio-入门篇(七)

一、前言 早前的文章&#xff0c;我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在&#xff0c;我们可以通过使用gradio&#xff0c;通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦&#xff0c; 让我们更方便地体验模型的效果。 二、术语 2.…

2024蓝桥A组E题

成绩统计 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序难度等级 问题描述 题目有问题方差定义那加平方&#xff08;vi-v&#xff09; 格式输入 输入的第一行包含三个正整数n,k,T &#xff0c;相邻整数之间使用一个空格分隔。 第二行包含n个正整数…

缓存预热和刷新的具体操作方式

缓存预热的具体操作方式 1. 数据准备 识别需要预热的数据&#xff1a;这通常是应用程序的热点数据或基础数据&#xff0c;即用户访问频率较高的数据。从数据源&#xff08;如数据库&#xff09;中获取这些数据&#xff0c;并将其转换成适合缓存存储的格式。 2. 数据存储 使…

SpringBoot+vue前后端分离

1.前端查询&#xff08;传递封装的参数&#xff09; loadPost(){this.$axios.post(this.$httpUrl/user/listPageC1,{pageSize:this.pageSize,pageNum:this.pageNum,param:{name:this.name,sex:this.sex}}).then(res>res.data).then(res>{console.log(res)if(res.code200)…

Flink SQL:debezium-json 格式的表一定是数据库的 CDC 数据吗?

debezium-json 格式有一种非常典型的应用场景,就是:上游(Source)是一张使用 Flink CDC 接入的关系数据库中的表,下游(Sink)是一张创建在 Kafka 上的表,这张表的 format 往往会定义为 debezium-json,以便 Flink 能获得全面的 CDC 信息用于流上的实时处理,这种场景我们…

centos安装mysql并设置远程访问

下载之前先删除有关mysql 使用rpm查看已安装的安装包 rpm -qa|grep mysql使用yum卸载安装的mysql yum remove mysql mysql-server mysql-libs mysql-server查询剩下的 rpm -qa|grep mysql删除剩下的 rpm -ev 直接放你查到的删除剩余的 rm -rf mysql*再次找 find / -name…

Kubernetes(k8s)集群搭建部署,master节点配置

目录 1.切换为root用户 2.关闭防火墙&#xff0c;关闭swap分区和禁用SElinux 3.安装docker 4.更改daemon.json文件&#xff0c;指定 Docker 守护进程使用的 cgroup 驱动程序 5.重启docker服务 6.配置kubernetes.repo 7.安装Kubelet、Kubeadm、Kubectl 8.设置开机自启 …

【数据结构|C语言版】单链表应用

前言1. 基于单链表实现通讯录1.1 知识要求1.2 功能要求 2. 代码总结2.1 SeqList.h2.2 SeqList.c2.3 Contact.h2.4 Contact.c2.5 test.c 后言 上期回顾&#xff1a;【数据结构|C语言版】单链表 前言 各位小伙伴大家好&#xff01;上期小编讲解了单链表相关知识&#xff0c;在此…

【Go】原子并发操作

目录 一、基本概念 支持的数据类型 主要函数 使用场景 二、基础代码实例 开协程给原子变量做加法 统计多个变量 原子标志判断 三、并发日志记录器 四、并发计数器与性能监控 五、优雅的停止并发任务 worker函数 Main函数 应用价值 Go语言中&#xff0c;原子并发操…

Qt C++ 实现无边框窗口

Qt C 实现无边框窗口 // widget.h #ifndef WIDGET_H #define WIDGET_H#include <QDebug> #include <QHBoxLayout> #include <QMouseEvent> #include <QPushButton> #include <QString> #include <QWidget>#define PADDING 6enum Location…