Javase --- 多线程复习
admin
2024-01-20 05:58:01
0

Java 多线程

程序

静态文件 程序 启动以后以 进程方式在 操作系统驻留

进程 (可以看见)

  • 程序运行过程中 在操作系统内存中一个一个的实例。
  • 进程之间 独立存储 独立管理的 彼此是隔离的。
  • 程序 在 运行过程 中 至少有一个 进程与之对应 取决于 设计方式
  • 进程启动 默认 会启动一个 主线程(决定进程的生死 主线程死 进程死 主线程生 进程生)。

总结 :

  • 程序 执行进入内存运行,变为一个进程
  • 进程间的资源(内存、文件····)是彼此隔离的,其他进程不允许访问(读取和写入)的。

线程 (看不见)

eg :

  • 迅雷 多线程下载软件

概念 :

  • 线程 是 进程内的一个 “基本任务”,每个线程都有自己的功能, 是 CPU 分配和调度的基本单位
  • 一个进程内可以包含多个线程 , 一个线程只能隶属于一个进程
  • 进程内至少拥有一个 线程 这个线程叫做 主线程 主线程消亡 进程 结束。

CPU、进程、线程

单核 CPU

时间片(cpu 一段的执行时间 以 纳秒 为单位)
时间片 分配给 某个线程 ----> 某个线程 来执行
这种情况 叫并发执行。

多核
  • 一个线程 在同一时间 只能拥有一个 CPU 的时间片
  • 而 多个线程 在不同时间 可以 拥有不同 CPU 的时间片

这就有了 并行 执行

Java 中的 进程 与 线程

Java 最简单程序的进程 包含 main 主线程 和 垃圾收集线程(没有关注你呢)

线程创建的三种方式

Thread (不推荐使用 Java 对 继承不友好)

package nuc.zm.MoreThread.create_thread;import nuc.zm.io.ObjectIOTest.Object;/*** demo1* @description 创建线程的方式 1* @author zm* @date 2022/10/15*/
public class Demo1 {public static void main(String[] args) {TestThread testThread = new TestThread();for (int i = 0; i < 10; i++) {System.out.println("不会出现争夺资源的main" + i);}Thread thread = Thread.currentThread();thread.setName("主线程");
//        让子线程先启动 才会出现 和主线程抢夺资源的情况hhtestThread.setName("子线程");testThread.start();for (int i = 0; i < 10; i++) {System.out.println(thread.getName() + i);}}static class TestThread extends Thread {/*** 运行* 线程对象 争抢资源的任务 必须放在 run 方法中*/@Overridepublic void run() {super.run();for (int i = 0; i < 10; i++) {System.out.println(getName()  + " ==== " + i);}}}
}

Runnable (Java编程友好 单无法返回执行后的数据)

package nuc.zm.MoreThread.create_thread;/*** 以及接下来* 实现 Runnable 接口 成为线程类* @author zm* @date 2022/10/16*/
public class Demo2 implements Runnable{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "====" + i);}}//   main 线程 启动器public static void main(String[] args) {Demo2 demo2 = new Demo2();Thread thread = new Thread(demo2);thread.setName("子线程~~");thread.start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "========" + i);}}
}

Callable (涉及到线程池 且线程方法具有返回值 但编程显复杂)

package nuc.zm.MoreThread.create_thread;import java.util.Random;
import java.util.concurrent.*;/*** 可调用测试** @author zm* @date 2022/11/06*/
public class CallableTest {public static void main(String[] args) throws ExecutionException, InterruptedException {ThreadTest threadTest = new ThreadTest();threadTest.start();}static class ThreadTest implements Callable {private String name;@Overridepublic Integer call() throws Exception {int speed = new Random().nextInt(10);int result = 0;for (int i = 1; i < 10; i++) {Thread.sleep(1000);result = i * speed;System.out.println("第 " + i + " 秒 " + this.name + " 已经跑到  " + result + " 米 " + " 速度 " + speed + " 米/秒 ");}return result;}public void start() throws ExecutionException, InterruptedException {
//        线程池ExecutorService executorService = Executors.newFixedThreadPool(3);ThreadTest threadTest = new ThreadTest();threadTest.name = "参赛者A";ThreadTest threadTest1 = new ThreadTest();threadTest1.name = "参赛者B";ThreadTest threadTest2 = new ThreadTest();threadTest2.name = "参赛者C";Future submit = executorService.submit(threadTest);Future submit1 = executorService.submit(threadTest1);Future submit2 = executorService.submit(threadTest2);executorService.shutdown();System.out.println(threadTest.name + "跑了" + submit.get() + "米");System.out.println(threadTest1.name + "跑了" + submit1.get() + "米");System.out.println(threadTest2.name + "跑了" + submit2.get() + "米");}}}
package nuc.zm.MoreThread.create_thread;import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** demo3* 实现 callable 接口* @author zm* @date 2022/10/16*/
public class Demo3 implements Callable {/*** 调用* 抛 子类 异常* @return {@link Double}*/@Overridepublic Double call() {return (double) new Random().nextInt(10);}public static void main(String[] args) throws ExecutionException, InterruptedException {Demo3 demo3 = new Demo3();FutureTask futureTask = new FutureTask<>(demo3);Thread thread = new Thread(futureTask);thread.start();Object o = futureTask.get();System.out.println(o);}
}

线程 同步问题

现实案例 : 抛绣球案例 很多人争抢一个绣球(资源)

synchronized(同步锁)

作用 : 利用一个特定的对象设置一个锁 , 在 多线程 并发访问的时候,同时只允许一个线程 获得这个锁,并执行特定代码。
执行后 会释放锁, 继续和其他线程争抢资源。

所有线程都访问 同一个打印方法 就会出现 线程安全问题

package nuc.zm.MoreThread;/*** 同步采样* 演示 同步锁* @author zm* @date 2022/11/06*/
public class SyncSample {static class Printer {public void print() {try {Thread.sleep(500);System.out.print("你");Thread.sleep(500);System.out.print("好");Thread.sleep(500);System.out.print("世");Thread.sleep(500);System.out.print("界");} catch (InterruptedException e) {e.printStackTrace();}}}public void start() {Printer printer = new Printer();for (int i = 0; i < 10; i++) {PrintTask printTask = new PrintTask();printTask.printer = printer;Thread thread = new Thread(printTask);thread.start();}}static class PrintTask implements Runnable {private  Printer printer;@Overridepublic void run() {printer.print();}}public static void main(String[] args) {new SyncSample().start();}
}

解决 加锁

synchronized 代码块 – 任意对象
synchronized 方法 – this 当前对象
synchronized 静态方法 – 该类的字节码对象

package nuc.zm.MoreThread;import java.util.concurrent.locks.Lock;/*** 同步采样* 演示 同步锁* @author zm* @date 2022/11/06*/
public class SyncSample {static class Printer {public void print() {synchronized ("DADADADASDADAADADAD") {try {Thread.sleep(500);System.out.print("你");Thread.sleep(500);System.out.print("好");Thread.sleep(500);System.out.print("世");Thread.sleep(500);System.out.print("界");} catch (InterruptedException e) {e.printStackTrace();}}}public  synchronized  void print1() {try {Thread.sleep(500);System.out.print("你");Thread.sleep(500);System.out.print("好");Thread.sleep(500);System.out.print("世");Thread.sleep(500);System.out.print("界");} catch (InterruptedException e) {e.printStackTrace();}}public  static synchronized  void print2() {try {Thread.sleep(500);System.out.print("你");Thread.sleep(500);System.out.print("好");Thread.sleep(500);System.out.print("世");Thread.sleep(500);System.out.print("界");} catch (InterruptedException e) {e.printStackTrace();}}}public void start() {Printer printer = new Printer();for (int i = 0; i < 10; i++) {PrintTask printTask = new PrintTask();printTask.printer = printer;Thread thread = new Thread(printTask);thread.start();}}static class PrintTask implements Runnable {private  Printer printer;@Overridepublic void run() {printer.print();
//                printer.print1();
//                Printer.print2();}}public static void main(String[] args) {new SyncSample().start();}
}

线程安全

  • 在 拥有 多条线程 并行执行的程序中,线程安全的代码 会通过同步机制保证各个线程可以正常 且正确的执行,不会出现数据污染的意外情况。

线程池

JUC 并发工具包 解决 同步 和 互斥问题

  • Runnable 新建 线程 , 性能差~~~
  • 线程 被频繁创建,相互竞争,严重时可能导致系统资源死机或者内存溢出
  • 线程池 ----- 线程复用
  • ThreadPool 线程池
    • 重用 存在的线程,减少线程对象的创建,消亡的开销
    • 线程总数可控,提高资源的利用率
    • 提供额外功能,定时执行,定期执行 和 监控。
  • 支持的线程池种类
    • 工具类 Executors(juc 包下) 创建线程池
    • FixedThreadPool - 定长线程池
    • CachedThreadPool - 可缓存的线程池
    • SingleThreadPool - 单线程池
    • ScheduledThreadPool - 调度线程池

相关内容

热门资讯

FXGT:平台监管合规与全球市... 本文探讨FXGT平台的核心优势,重点分析其监管合规性和全球市场连接的整合价值。通过严格的合规框架,F...
原创 1... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
原创 美... 2026 年 1 月 13 日,美国多家媒体集中披露两条重磅消息,中国美债持仓降至 6887 亿美元...
融资保证金比例重回100%:A... "两融余额突破2.67万亿!"当这个数字刷屏各大财经媒体时,监管层的一纸通知瞬间引爆市场——融资保证...
靠中式精酿9个月狂卖11亿,河... 不到两年时间,一群“微醺女孩”把一家成立44年的河南地方啤酒厂推到IPO门口。 1月13日,河南金星...
原创 黄... 哈喽大家好,今天小无带大家聊聊最近刷屏的抢金热潮!金饰价格飙涨不停,一条项链一夜涨1.5万还被疯抢,...
原创 虚... 小睿就来深扒“纸上黄金”的IPO迷局,Suplay冲刺港股欲成“收藏卡第一股”,靠米哈游IP赚足利润...
北京CBD千亿规模国际级商圈初... 央广网北京1月14日消息(记者 王进文)1月14日,记者从北京市朝阳区两会新闻发布会上了解到,北京商...
原创 9... 什么样的酒能赢得市场? 2026年开年,A股市场的“分裂感”格外清晰。一边,是上证指数稳步站上410...
北方稀土设备供应商,广泰真空上... 来源丨时代商业研究院 作者丨陆烁宜 编辑丨郑琳 时隔3个月,“超长验收”项目披露的数量却翻倍,沈阳广...
热点城市启动新年“第一拍” 民... 来源:21世纪经济报道 21世纪经济报道记者 张敏 1月14日,青岛2026年首场宅地拍卖落锤。在市...
啤酒卖不动了,中式精酿能救金星... 在中国啤酒行业,已经很久没有出现真正意义上的 " 新故事 " 了。 过去十余年,这个一度被视为现金牛...
小组第二出线!U23亚洲杯-李... 北京时间1月14日消息,2026年U23亚洲杯小组赛继续进行,在D组最后一轮争夺中,中国U23男足迎...
原创 反... 当地时间1月12日,一场不简单的会议在美国悄然召开,G7成员国的财长们、欧盟的代表、还有来自澳大利亚...
创尔生物再次折戟IPO:股东股... 近日,深耕胶原蛋白领域二十余年的广州创尔生物技术股份有限公司(以下简称“创尔生物”)在全国中小企业股...
仓储物流巨头普洛斯中国迎来女C... 1月14日,普洛斯集团(GLP Pte Ltd,简称“GLP”)宣布任命公司创始成员、中国物流仓储与...
耐心资本赋能新质生产力 成都高... 活动现场 图片来源:成都高新区提供 发布“双清单”,进行主题分享、项目路演等,搭建资本与产业精准对接...
40多年来广东制造爆款频出,董... “质量关乎两个生命:消费者的生命和企业的生命,广货的底气正是来自这份刻进骨子里的质量意识。”1月14...
世界经济论坛年度风险报告:全球... 财联社1月14日讯(编辑 史正丞)世界经济论坛周三发布的全球风险报告显示,涵盖关税、制裁等工具的地缘...
原创 果... 当地时间1月12日,特朗普在“真实社交”上甩出一记经贸重拳,宣称对所有与伊朗有商业往来的国家加征25...