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 - 调度线程池

相关内容

热门资讯

原创 4... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
胜宏科技港股大涨49% 做完英... 记者 陈月芹 4月21日,全球AI算力板龙头胜宏科技(02476.HK)登陆港交所,上市首日股价大涨...
永赢基金:聚焦“科技新锐”,科... 数据来源:Wind,时间统计区间为2025/1/1-2026/4/21,指数过往表现不预示未来,不构...
五大阅读趋势显现!当当网发布2... 在第31个世界读书日即将来临之际及首个全民阅读活动周期间,当当网正式发布2026国民阅读洞察报告。 ...
业绩逐季回暖 老百姓大药房一季... 上证报中国证券网讯(记者 夏子航)4月22日晚,老百姓大药房发布2025年年报和2026年一季报。今...
中国20强城市大洗牌:苏州接近... 中国的城市经济竞争格局一直在变化,每年发布的GDP数据都会对城市经济实力进行重新排列。2025年榜又...
直击金宏气体股东会:预期年内氦... 《科创板日报》4月22日讯(记者 郭辉)金宏气体日前举行2025年度股东大会。会上该公司审议了公司年...
5月1日起,俄据悉将叫停哈萨克... 据行业消息人士透露,俄罗斯将于5月1日起停止经友谊管道转运哈萨克斯坦输往德国的石油,相关调整计划已送...
深化具身智能生态布局 京东携手... 4 月 22 日,京东与国内消费级人形机器人头部企业松延动力正式达成三年期战略合作。双方将围绕产品研...
原创 帮... 先问你一个问题,美伊停火今晚到期,按常理避险情绪该升温,黄金应该涨吧?结果恰恰相反——原油涨了,黄金...
300295、600889,将... 三六五网、南京化纤,将被*ST。 公司股票自4月23日开市起停牌一天,于4月24日开市起复牌并实施退...
能源大变天!外媒:羡慕中国的石... 这一次油价突破 110 美元的能源危机,着实魔幻。如果放在十年前,没人会相信中国能在这场风波中获利,...
黄金涨跌两难,现在还能上车吗? 中新网4月22日电(记者 左雨晴) 四月以来,美伊局势反复拉扯,美联储降息预期一变再变。黄金价格在4...
“我身体健康”,库克现身员工大... 当地时间4月21日,受苹果官宣CEO换届影响,公司股价盘中下探超2%,总市值失守4万亿美元关口,收盘...
库克留下一个悬念 工程师能否拯救创新节奏? 听筒Tech(ID:tingtongtech)原创 文 | 赵 森 ...
探索消费信贷与社交支付深度融合... 腾讯这一金融产品再添新功能,4月19日,北京商报记者注意到,微信分付灰度测试转账功能引发热议,在向微...
土耳其主要银行股指早盘下跌2% 每经AI快讯,4月20日,土耳其主要银行股指早盘下跌2%。 每日经济新闻
好用的OTA代运营源头厂家 在如今竞争激烈的酒旅行业中,OTA代运营服务成为了众多酒店、民宿提升竞争力的关键。但市场上的代运营厂...
成都五一出游全国热门第三 “五一”假期临近,同程旅行最新发布的《2026“五一”旅行趋势报告》显示,今年“五一”期间成都同时位...