线程的创建和使用(一)

news/2025/2/19 17:04:32/

1、线程

1.1、线程的概念

一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行着多份代码.

1.2、创建线程

方法一:继承Thread类


public class Exe_01 {public static void main(String[] args) {//实例化线程对象MyThread01 myThread01=new MyThread01();//运行这个线程myThread01.start();}
}//通过继承Thread类的方式来创建一个线程
class MyThread01 extends Thread{@Overridepublic void run() {System.out.println("Hello 鸡你太美!!");}
}

运行结果:

 

 观察线程调度:


public class Exe_02 {public static void main(String[] args) {//实例化线程对象MyThread02 myThread02=new MyThread02();//真正去操作系统中申请线程并参与CPU调度myThread02.start();//在主线程也做一个死循环打印while(true){System.out.println("唱跳,rap,篮球");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}class MyThread02 extends Thread{//定义线程要执行的任务@Overridepublic void run() {//在一个死循环中做打印while(true){System.out.println("哎呦,你干嘛!!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

运行结果:

 

 方法二:实现Runnable接口


public class Exe_03 {//通过实现Runnable的方式创建线程public static void main(String[] args) {//实例化自定义线程类MyRunnable runnable=new MyRunnable();//通过Thread的构造方法把Runnable作为参数传入Thread thread=new Thread(runnable);//启动线程才是真正意义上的创建系统线程,参与CPU调度thread.start();}
}//实现Runnable接口
class MyRunnable implements Runnable{//定义线程要执行的任务@Overridepublic void run() {while(true){System.out.println("年轻人,耗子为汁+1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

运行结果:

 

由我来给大家利用线程制作一个蔡徐坤经典名场面


public class Exe_04 {public static void main(String[] args) {//练习生任务Runnable01 runnable01=new Runnable01();//第一步给大家打个招呼Thread t1=new Thread(runnable01);t1.start();//表演任务Runnable02 runnable02=new Runnable02();//第二步给介绍鸽鸽的特长Thread t2=new Thread(runnable02);t2.start();//音乐走你Runnable03 runnable03=new Runnable03();//第三步showTimeThread t3=new Thread(runnable03);t3.start();}
}//创建Runnable类
//定义一个练习两年半练习生的任务
class Runnable01 implements Runnable{@Overridepublic void run() {while (true) {System.out.println("全明星制作人们,大家好,我是一个练习时长两年半的个人练习生蔡徐坤");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
//定义一个小黑子的任务
class Runnable02 implements Runnable{@Overridepublic void run() {while (true) {System.out.println("喜欢唱、条、rap、篮球");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
//点一首music送给鸽鸽
class  Runnable03 implements Runnable{@Overridepublic void run() {while (true) {System.out.println("music");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

运行结果:

通过Thread类的匿名内部类的方式创建线程

/*
通过Thread类的匿名内部类的方式创建线程*/
public class Exe_5 {public static void main(String[] args) {Thread thread=new Thread(){public void run(){while (true) {System.out.println("通过创建Thread类的匿名内部类的方式创建线程");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};thread.start();}
}

运行结果:

 通过创建实现了Runnable接口的匿名内部类的方式创建线程

/*
通过创建实现了Runnable接口的匿名内部类的方式创建线程*/
public class Exe_06 {public static void main(String[] args) {Thread thread=new Thread(new Runnable() {@Overridepublic void run() {int count = 0;while(true) {System.out.println("通过创建实现了Runnable接口的匿名内部类的方式创建线程" + count++);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});//启动线程thread.start();}
}

对比:上面两种方法

继承Thread,直接使用this就表示当前线程的引用。

实现Runnable接口,this表示的是MyRunnbale的引用,需要使用Thread类来调用

 3、通过lambda的方式创建线程


public class Exe_07 {public static void main(String[] args) {Thread thread=new Thread(()-> {int count=0;while(true){count++;System.out.println("通过lambda表达式的方式创建一个线程"+count);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//启动线程thread.start();}
}

 2、多线程的优势

多线程的优势--增加运行速度

多线程就是为了能够充分的利用CPU的资源,提升程序运行效率。

需求场景:

分别对两个变量做累加100亿次操作

一种是单线程执行,一种是两条线程并发操作。

/*多线程的优势-增加运行速度
分别对两个变量做100亿次累加操作*/
public class Exe_08 {private static long count=10_0000_0000l;public static void main(String[] args) {//串行方式serial();//并行方式concurrency();}private static void concurrency() {//记录开始时间long begin=System.currentTimeMillis();//创建线程,在单个线程中执行对一个变量的累加Thread t1=new Thread(()->{long a=0l;for (int i = 0; i < count; i++) {a++;}});Thread t2=new Thread(()->{long b=0l;for (int i = 0; i < count; i++) {b++;}});//启动线程t1.start();t2.start();//等待try {t1.join();t2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}//记录结束时间long end=System.currentTimeMillis();System.out.println("并行操作用时:"+(end-begin)+"ms.");}private static void serial(){//记录开始时间long begin=System.currentTimeMillis();long a=0l;//对变量进行累加for (int i = 0; i < count; i++) {a++;}long b=0l;for (int i = 0; i < count; i++) {b++;}//累加完成之后记录结束时间long end=System.currentTimeMillis();System.out.println("串行操作用时:"+(end-begin)+"ms.");}
}

运行结果:

结论:多线程的使用可以明显的提高程序的运行效率,充分利用CPU的资源。


http://www.ppmy.cn/news/411640.html

相关文章

鼎捷易飞ERP视频教程-金速鹏-专题视频课程

鼎捷易飞ERP视频教程—539人已学习 课程介绍 鼎捷易飞ERP&#xff0c;源自台湾制造业&#xff0c;集成供应链、生产制造、财务管理。沿海企业广泛应用。制造业ERP首选。 课程收益 全面掌握易飞ERP各模块功能及操作、业务案例实现。 讲师介绍 金速鹏 更多讲师课程 20年IT从…

视频教程-用友U8视频教程全集(全模块)-ERP

用友U8视频教程全集(全模块) 20年IT从业经历&#xff0c;精通C#.NET编程&#xff0c;C/C编程&#xff0c;数据库SQL&#xff0c;嵌入式开发&#xff0c;企业信息化&#xff0c;ERP&#xff0c;OA&#xff0c;企业网络技术。 一直在企业IT领域工作&#xff0c;所谓的人才就是要有…

高手博客地址

http://mindhacks.cn http://blog.csdn.net/pongba

100个IT人成为大牛必备的学习经验分享

作为一名合格的IT人&#xff0c;这些课程你肯定不会错过&#xff0c;今天给大家来一个终极揭秘版100个精品教程&#xff0c;希望对大家有帮助~ 4.20 IT充电节 活动日期&#xff1a;2017.4.19-2017.4.20 活动地址&#xff1a;http://edu.51cto.com/activity/lists/id-47.html?w…

视频教程-金蝶K3 WISE 视频教程-ERP

金蝶K3 WISE 视频教程 20年IT从业经历&#xff0c;精通C#.NET编程&#xff0c;C/C编程&#xff0c;数据库SQL&#xff0c;嵌入式开发&#xff0c;企业信息化&#xff0c;ERP&#xff0c;OA&#xff0c;企业网络技术。 一直在企业IT领域工作&#xff0c;所谓的人才就是要有动手解…

数学加法速算法

数学速算法的分类 金华全脑速算的运算原理是通过双手的活动来刺激大脑&#xff0c;让大脑对数字直接产生敏感的条件反射作用&#xff0c;所以能达到快速计算的目的。 (1)以手作为运算器并产生直观的运算过程。 (2)以大脑作为存储器将运算的过程快速产生反应并表示出。 例如&…

计算机硬盘ssd,让您的电脑飞起来 教你如何正确使用SSD

1正确安装SSD后方可性能最大化 众所周知电脑升级SSD后&#xff0c;速度和性能都有大幅度提升。可是&#xff0c;有的用户升级SSD后&#xff0c;速度和性能提升却不明显。原因在于没有正确使用SSD&#xff0c;安装好操作系统。常见的问题是4K不对齐&#xff0c;没有开启Trim&…

CSDN学霸课表——企业网络经典案例

企业网络经典案例实验 讲师&#xff1a;金速鹏 课程以大型连锁集团网络为案例&#xff0c;在理论基础上&#xff0c;充分实验&#xff0c;实现典型的集团网络架设与调试。集团双线接入&#xff0c;与全国各分公司VPN组成虚拟内网。 ►开始学习 https在云服务器请求的启用 讲师&…