首页 > 其他分享 >m2_day04 [线程]

m2_day04 [线程]

时间:2024-05-10 23:42:48浏览次数:17  
标签:调用 Thread day04 线程 当中 m2 执行 方法

课程内容:
  • 线程的概念

  • 引用多线程的原因?

  • 如何实现线程?

  • 如何控制线程?

  • 线程类其它常用方法


线程的概念
  • 线程所在包:java.lang.Thread

  • 理解程序 进程 线程之间的区别:

    程序: 保存在物理介质中的代码片段

    进程: 一旦程序运行起来 就变成了操作系统当中的一个进程
    进程 = 进行当中的程序

    线程: 线程是进程当中更加微观的概念
    程序运行当中一条独立的执行线索
    而多线程编程 就是让程序当中同时拥有多条彼此独立的执行线索
    从而可以同一时间完成多项任务
    同一时间执行多个操作
    同一时间服务多个用户
  • 线程的五大状态 == 生命周期

    新生       就绪        运行         消亡
    NewBorn Runnable Running Dead

          阻塞
        Blocking
    *:CPU时间片 = CPU让一个线程执行一次的时间单位    

引用多线程的原因?
我们不否认 在某些场景下 使用多线程的确可以提高效率
但是使用多线程的根本目的
是为了让程序当中拥有多条独立的执行线索
从而同时完成多项任务(同时服务多个用户)

如何实现线程?
1.extends Thread
   @Override
   public void run(){
  给线程布置任务;
}
2.implements Runnable
   @Override
   public void run(){
  给线程布置任务;
}
3.implements Callable<T>
   @Override
   public T call() throws Exception{
  给线程布置任务;
}
return ;

*: 第三种实现线程的方式跟前两种的区别?
   1>前两种方式只能返回void,第三种方式可以返回一个泛型。
2>前两种方式不能在方法体后面抛异常,所以只能在方法体内自行try catch,第三种方式能够在方法体后面抛异常,所以不用try catch。
   3>前两种方式既可以start启动也可以通过线程池启动,第三种方式只能通过线程池启动。
       
*: 如何通过线程池启动?
  ExecutorService es = Executors.newFixedThreadPool(2); //创建执行服务
  Future<Boolean>xxx = es.submit(线程对象);//提交执行
  T xx = xxx.get();//获取结果
  es.shutdownNow();//关闭服务

*: shutdown()和shutdownNow()的区别与联系?
   >>联系:
       shutdown() 和 shutdownNow()调用之后
       都可以禁止新任务再次提交
       另外 它们都不能结束正在执行中的线程任务
>>区别:
       它们的区别在于那些已经提交上去 还没开始执行的线程任务
       shutdown() : 提交上去的任务 无论是否已经开始执行
                   都能最终执行结束
       shutdownNow() : 只有执行当中的能够执行结束
                   排队中的线程任务会被直接退回

如何控制线程?
0.setPriority(int):设置线程的优先级别
  可选范围1-10 默认优先级为5
  优先级高代表抢到时间片的概率高而已
  先设置优先级 再拿对象.start()启动
   
1.static sleep(long): 让当前线程休眠指定的毫秒数(主动进入阻塞状态)
  Thread.sleep(5000);
   
2.static yield():让当前线程直接放弃时间片返回就绪
Thread.yield();
   
3.join():让当前线程邀请调用方法的那个进程优先执行(主动进入阻塞状态)
        在被邀请的进程执行结束之前 当前进程一直处于阻塞态
  et.join()
该方法出现在哪个线程当中 那个线程就是当前线程
  谁主动调用join()方法 谁就是被邀请优先执行的进程
   
*:线程章节所有主动进入阻塞状态的方法 都必须进行异常处理
  因为它们都有throws InterruptedException声明
  而InterruptedException 属于非运行时异常
   
*: 线程章节所有的静态方法 不要关注谁调用方法
  而要关注 调用出现在哪个线程的线程体
  出现在谁的线程体 就是操作那个线程
  [别看谁点 看写哪]
   
*: 一个静态方法被调用了 方法体当中没有任何办法得到调用方法的对象
  无论谁调用的方法 都等价于类名直接调用的
 
练习题:
一个向往美好的和尚 与 诸多动物一起旅游的故事

- 西游记
故事当中涉及到如下多个线程

有个师傅线程 打印999次 "Only You能伴我取西经"
有个悟空线程 打印888次 "俺老孙来也"
有个悟能线程 打印777次 "分行李吧 回高老庄"
有个悟净线程 打印666次 "大师兄不好了 师傅被妖怪抓走了"

*: 师傅天天逼逼叨叨特别烦人 请让他优先级最低
setPriority(1);
*: 猴哥想要给师弟们更多的表现机会 前三次获得时间片
  他会主动放弃   yield();  
*: 八戒很懒 干活之前先休眠300毫秒
sleep();
*: 悟净很依赖猴哥 猴子不死 他就不上
join();

线程类其它常用方法
0.setName() + getName(): 设置和得到线程的名字

1.static activeCount(): 得到程序当中所有活跃线程的总数
活跃线程:就绪+运行+阻塞
          Thread.activeCount()
*:能够协助程序员统计在线人数
                           
2.setDaemon(true): 设置线程成为守护线程
  守护线程: 是为其它线程提供服务的
              当程序当中只剩下守护线程的时候
      守护线程会自行消亡
1> 守护线程通常都是无限循环 防止其过早消亡
2> 设置成为守护线程的操作必须早于它的start()
          否则不但会操作失败 还会导致运行时异常IllegalThreadStateException
3> 守护线程应该具有较低的优先级别 防止与核心业务抢时间片  
           
3.interrupt(): 中断线程的阻塞状态
et.interrupt();
      该方法出现在哪个线程当中 哪个线程就是当前主动出手的线程
  谁主动调用interrupt()方法 谁就是被打断阻塞状态的进程
 
4.static currentThread() : 获得当前正在执行的线程对象
1.可以在主方法当中用来获得主线程对象...
Thread zxc = Thread.currentThread();
2.可以出现在run()调用的其它方法中 用于获得当前线程是谁...
X.它不该直接出现在run()当中
因为得到的一定等价于this
5.CountDownLatch => CountDown 倒数(倒计时) Latch 插销(门闩)
构造方法:
CountDownLatch latch = new CountDownLatch(门上的插销个数);
传参指定总共设置多少个门闩
核心方法:
latch.await() : 插上插销等待开门(主动进入阻塞状态)
latch.countDown() : 打开一个插销
   

标签:调用,Thread,day04,线程,当中,m2,执行,方法
From: https://www.cnblogs.com/zhaodenghui33/p/18185522

相关文章

  • m2_day06 [线程池]
    课程内容:线程池的概念线程池的种类自定义线程池执行器线程池的概念线程池:所谓线程池是一种标准的资源池模式​资源池模式就是在用户出现之前提前预留活跃资源从而在用户出现的第一时间直接满足用户对资源的需求并且将资源的新建和销毁操作都委托......
  • m2_day05 [线程]
    课程内容:什么是并发错误?如何解决并发错误?什么是死锁?如何解决死锁?锁池和等待池的区别什么是并发错误?并发错误的概念多个线程共享操作同一份数据的时候线程体当中连续的多行操作未必能够连续执行很可能操作只完成另一部分时间片就突然耗尽此时......
  • m2_day2
    课程内容:搭建开发环境配置环境变量第一个程序HelloWorldJava中的软件包结构搭建开发环境:安装jdkwww.Oracle.comSDK=softwaredevelopmentkits=软件开发工具包JDK=java+SDK=java软件开发工具包JRE=javaruntimeenvironment=java运行环境JD......
  • 理解 iOS 中的多线程编程
    在iOS应用开发中,多线程编程是一项关键技术,可以帮助应用实现更好的性能和响应性。本文将详细解释iOS中的多线程编程,并讨论如何在应用中正确地使用多线程以提高性能和响应性。1.什么是多线程编程?多线程编程是指在一个应用程序中同时执行多个线程(线程是进程中的执行单元),从而实......
  • 操作系统线程和Java线程的状态
    操作系统线程和Java线程的状态  一、操作系统线程的状态  操作系统的线程主要有以下三个状态  1. 就绪状态(ready):线程正在等待使用CPU,经调度程序调用之后进入running状态。  2.执行状态(running):线程正在使用CPU。  3.等待状态(waiting):线程经过等......
  • 如果想得到线程中的反悔呢
    importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.*;publicclassMain{publicstaticvoidmain(String[]args){intcorePoolSize=5;//核心线程数intmaxPoolSize=10;//最大线程数longkeepAlive......
  • 要获取线程池中任务的返回值,可以使用submit()方法返回的Future对象。你可以通过调用Fu
    importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;publicclassMain{publicstaticvoidmain(String[]args){//设置线程池参数intcorePoolSize=5;//......
  • Java-线程-线程池
    0.背景参考资料:Java线程池实现原理及其在美团业务中的实践在Java早期,每次创建线程时,都要涉及到线程的创建、销毁以及资源管理,这对于系统的性能和资源利用率是一种浪费。因此,Java提供了线程池的概念,以提高线程的管理效率和性能。资源管理优化:传统的线程创建和销毁需要涉......
  • 国密算法SM2-java实现
    Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>工具类importjava.math.BigInteger;publicclassUtil{......
  • RR级别-多线程环境下-for update+插入操作包含的间隙锁+插入意向锁引发的死锁问题
    记录selectforupdatemysql死锁问题_执行select...where...forupdate是否会造成死锁(deadlock)-CSDN博客......