• 多线程编码细节1


    Thread类

    Thread类实现了Runnable接口,所以Thread对象也是可运行Runnable对象,同时Thread类也是线程类

    Thread类定义

    • Thread()//一般用于在Thread类中覆盖定义run方法,可以使用匿名内部类进行定义
    • Thread(Runnable)//使用最多的情况,run方式是由Runnable参数对象提供
    • Thread(String name) //自定义线程名称
    • Thread(Runnable,String name)

    由于Runnable接口属于函数式接口,所以一般使用简化写法
    Thread t = new Thread(()->{
        System.out.println(Thread.currentThread());
    });
    t.start();

    常见方法

    方法说明
    void start()使该线程开始执行,注意不是立即执行,不是一般方法调用;Java 虚拟机调用该线程的 run 方法
    void run()线程的执行体
    void setName(String)改变线程名称
    void setPriority(int)更改线程的优先级,Java中线程的优先级可以分为1-10,默认为5
    void setDaemon(boolean)设置守护线程,守护线程是一种用于提供服务的线程,一般线程体中使用的是死循环,会在所有非守护线程退出后自动关闭
    void join()/(long millisec)等待该线程终止的时间最长为 millis 毫秒
    void interrupt()中断线程,不是中断线程的执行,而是修改中断参数
    boolean isAlive()测试线程是否处于活动状态,活动状态就是线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的
    static void yield()暂停当前正在执行的线程对象,并执行其他线程
    static void sleep(long millisec)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
    static Thread currentThread()返回对当前正在执行的线程对象的引用

    java针对线程提供了10级优先,优先级越高则获取更多的运行机会

    但是不同的操作系统不一定支持10级优先,所以设置优先级时可能会出现在java中的不同优先级映射到操作系统中相同的优先级上。在具体编程中如果需要使用优先级,建议把优先级的差距拉开

    Thread类中定义了3个常量
    public static final int MIN_PRIORITY = 1;最小优先级
    public static final int NORM_PRIORITY = 5;默认优先级
    public static final int MAX_PRIORITY = 10;最大优先级

    1. package com.yan1;
    2. public class Test4 {
    3. public static void main(String[] args) {
    4. Thread t1=new Thread(()->{//一般守护线程都会使用死循环,因为自动终止
    5. while(true) {
    6. System.out.println(Thread.currentThread());
    7. }
    8. });
    9. t1.setDaemon(true);//设置守护线程应该在start方法之前
    10. t1.start();
    11. System.out.println("Main...end");
    12. }
    13. }
    1. package com.yan1;
    2. /*
    3. * void join()/(long millisec)等待该线程终止的时间最长为millis毫秒
    4. *
    5. * while (isAlive()) {
    6. long delay = millis - now;
    7. if (delay <= 0) {
    8. break;
    9. }
    10. wait(delay);
    11. now = System.currentTimeMillis() - base;
    12. }
    13. */
    14. public class Test5 {
    15. static int res=0;
    16. public static void main(String[] args) {
    17. Thread[] th=new Thread[10];
    18. for(int i=1;i<=10;i++) {
    19. int begin=(i-1)*100+1;
    20. int end=i*100;
    21. th[i-1]=new Thread(()->{
    22. // begin++;//匿名内部类中使用外部的临时变量(不是属性),要求临时变量必须final,final可写可不写
    23. for(int k=begin;k<=end;k++) {
    24. res+=k;
    25. //可能休眠的时候,正好在+1之前停止,可能会把+1给忘了
    26. // try {
    27. // Thread.sleep(5);
    28. // } catch (InterruptedException e) {
    29. // e.printStackTrace();
    30. // }
    31. }
    32. });
    33. th[i-1].start();
    34. }
    35. for(Thread tmp:th) {
    36. if(tmp!=null) {
    37. try {
    38. // tmp.join();//无限制等待,直到出现异常或者等待的对象tmp执行结束
    39. tmp.join(0);//0表示无限制等待,等价于无参数
    40. } catch (InterruptedException e) {
    41. e.printStackTrace();
    42. }
    43. }
    44. }
    45. System.out.println(res);
    46. }
    47. }
    1. package com.yan1;
    2. /*
    3. * void interrupt()中断线程,不是中断线程的执行,而是修改中断参数
    4. *
    5. * 具体实现依赖于调用interrupt方法后产生InterruptException实现的
    6. */
    7. public class Test6 {
    8. public static void main(String[] args) {
    9. Thread t1=new Thread(()->{
    10. while(true) {
    11. System.out.println(Thread.currentThread());
    12. try {
    13. Thread.sleep(1);
    14. } catch (InterruptedException e) {
    15. break;
    16. }
    17. }
    18. });
    19. t1.start();
    20. t1.interrupt();
    21. System.out.println("Main......end");
    22. }
    23. }
    1. package com.yan1;
    2. /*
    3. * boolean isAlive()测试线程是否处于活动状态,活动状态就是线程以及启动
    4. * 且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是"存活"的
    5. */
    6. public class Test7 {
    7. public static void main(String[] args) {
    8. Thread t1=new Thread(()->{
    9. System.out.println(Thread.currentThread());
    10. });
    11. t1.start();
    12. try {
    13. Thread.sleep(10);
    14. } catch (InterruptedException e) {
    15. e.printStackTrace();
    16. }
    17. System.out.println(t1.isAlive());
    18. System.out.println(t1);//Thread[Thread-0,5,]线程组main不要了,已经执行完了
    19. }
    20. }
  • 相关阅读:
    07——golang标识符、关键字、命名规则
    Java异常该如何正确使用,避坑指南
    SOCKS5代理在全球电商、游戏及网络爬虫领域的技术创新
    Laravel文档阅读笔记-How to deploy Laravel 8 project on Cpanel shared hosting
    CRM客户管理系统究竟是什么?如何实施?
    DDD概念理解
    Nacos 配置中心
    不得不会的MySQL数据库知识点(五)
    论文解读(DWL)《Dynamic Weighted Learning for Unsupervised Domain Adaptation》
    Autosar基础——车载信息安全SecOC
  • 原文地址:https://blog.csdn.net/tiger_root/article/details/126473008