多线程、反射

2023-11-08

【目录】

线程
实现线程
死锁
反射
注解

多线程:

在Java思想中,将并发完成的每一件事情称为线程。java语言提供了并发机制,程序猿可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制称为多线程。
这里写图片描述

一个简单的线程代码

package com.day08.thread;

public class MyThread extends Thread {
    @Override
    public void run() {
    System.out.println("路漫漫其修远今,吾将上下而求索。");
    }
}

package com.day08.thread;

public class Test {
    public static void main(String[] args) {
        //java的主线程
       MyThread my = new MyThread();
       System.out.println("线程开始执行");
       my.start();//在进程中申请独立的运行空间
       System.out.println("线程结束执行");
    }
}

优势:
系统空转时间减少
共享内存
多个任务同时进行
and so on……

实现多线程的两种方式:

1、继承java.lang.Thread类

public class MyThread extends Thread {
    public MyThread() {

    }

    public MyThread(String name) {
        super(name);
    }

    private static int ticket = 100;//注意将ticket装成静态的才能共享!
    private String lock = "asd";

    @Override
    public void run() {
        while (ticket > 0) {
            synchronized (lock) {
                if (ticket > 0) {
                    System.out.println(getName() + "卖出了第" + ticket + "张票");
                    ticket--;
                }
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class Test {
    public static void main(String[] args) {
         MyThread m1 = new MyThread("售票员1");
         MyThread m2 = new MyThread("售票员2");
         MyThread m3 = new MyThread("售票员3");
         MyThread m4 = new MyThread("售票员4");
         m1.start();
         m2.start();
         m3.start();
         m4.start();

2、实现java.lang.Runnable接口

public class MyRunnable implements Runnable {
    private int ticket = 100;
    private String s = "lock";// 定义一个锁

    @Override
    public void run() {

        while (ticket > 0) {
            synchronized (s) {// 设置锁
                if (ticket > 0) {//进来一个,上锁,其它的等待。
                    //当最后一张卖出,还有要进来的 所以判断票数
                    System.out.println(Thread.currentThread().getName() + "卖出了票号" + ticket);
                    ticket--;
                }
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

public class Test {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread m1 = new Thread(runnable, "售票员1");
        Thread m2 = new Thread(runnable, "售票员2");
        Thread m3 = new Thread(runnable, "售票员3");
        Thread m4 = new Thread(runnable, "售票员4");
        m2.setPriority(9);//优先级,在这里让m2优先售票
        m1.start();
        m2.start();
        m3.start();
        m4.start();
    }
}

这里是较为详细的地址【http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html

这里写图片描述

死锁

这里写图片描述

反射

Student类

public class Student {
     private int age;
     private String name;
     private String clazz;
    public int getAge() {
        return age;
    }
//  public void setAge(int age) {
//      this.age = age;
//  }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getClazz() {
        return clazz;
    }
    public void setClazz(String clazz) {
        this.clazz = clazz;
    }


}


import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) {
        Class<Student> clazz = Student.class;
//      //Field[] fields = clazz.getFields();// 以数组形式返回所有公共属性
//      Field[] fields = clazz.getDeclaredFields();//以数组形式返回所有属性
//      for (Field fie : fields) {
//          System.out.println(fie.getName());// 返回属性名称
//          System.out.println(fie.getType().getName());// 返回属性的类型名称
//          System.out.println(fie.getModifiers());// 反悔属性修饰符的整数形式
//      }


        Student zhangsan = new Student();
        try {
            Field age = clazz.getDeclaredField("age");//得到指定名称的属性AGE
            age.setAccessible(true);//取消java访问修饰符检查
            age.set(zhangsan, 18);//更改对象zhangsan的age属性为18
            age.setAccessible(false);//取消检查
            System.out.println(zhangsan.getAge());//输出对象zhangsan的age值
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}
动态展示反射案例:

这里写图片描述

注解

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程、反射 的相关文章

随机推荐

  • Pycharm的git/github配置及其问题解决

    1 连接git及github账号 首先右键file 选择setting 进入version control点击 会看到右面的Directory 此时可以进行git配置操作 点击github进入github账号配置 输入完账号密码后 点击te
  • Linux下根目录

    在linux下我们一直使用很多命令 比如ls cd mkdir等等 那这些命令是在哪个目录里呢 我们可以先看看根目录 所有目录都挂在根目录下 有且只有一个根目录 所有东西都从根目录开始 如果在终端输入 home 其实是告诉电脑从 根目录 开
  • 【JqGrid】jqgrid合并单元格之jeesite(jsite)项目中dataGrid合并单元格

    1 参考jqgrid官方的事件和方法https blog mn886 net jqGrid http www trirand com jqgridwiki doku php id wiki methods http www trirand
  • 可变参数模板与完美转发

    可变参数模板 可变参数模板 variadic template 是C 11新增的一项特性 使得模板参数可以任意化 一个基本的可变参数模板声明如下 template
  • 拜访陈朋之老师所感

    初次结识 妻子在2018年12月份备考PMP考试时 我陪妻子去上PMP培训课程 有幸结识陈朋之老师 由于当时课间请教陈老师问题的人比较多 我和陈老师只是做了自我介绍 未能进行深入交流 所幸期间妻子一直请教陈老师问题 经过商易大家约了一个时间
  • 常见的U盘,内存卡修复工具及其修复方法

    内存卡几乎每天都得使用 使用率非常高 当然出错或出毛病的时间也会很多 在平时使用内存卡的时候最容易出错的几点 1 内存卡读不出来或不被识别的毛病 2 在你急需存储资料的时候突然来个内存卡无法格式化让你懊恼不已 3 莫名的出现文件无法删除 文
  • 南开大学计算机科学与技术初试教材,南开大学计算机软件初试全书.pdf

    灰灰考研 南开大学plus 版本 附录四 南开大学plus 版本2 2019 南开大学招生简章2 2018 南开大学信息汇总3 2019 南开大学考试大纲10 812 计算机综合基础考试大纲10 813 程序设计与数据结构考试大纲12 81
  • openwrt-无线配置

    来源 华清远见嵌入式学院 默认开启无线网络 修改 package kernel mac80211 files lib wifi mac80211 sh vi package kernel mac80211 files lib wifi ma
  • LaTex科学论文写作

    关于科学论文的写作 之前也写过一些零散的总结 对科学论文的写作流程做一个总结 一般情况下 科学类论文包含论文正文 图表等相应的内容 在LaTeX中都需要相应的代码进行插入 参考文献也是通过自己构建数据库然后调用代码进行编译 从期刊网站下载模
  • 利用脑电和功能磁共振成像(fMRI)捕捉自我生成、任务启动的思维的时空动态

    自我产生 self generated 的认知的时间结构是有意义的意识流形成的关键属性 当我们休息时 我们的思想在不同的精神状态下从一个思想游荡到另一个思想 尽管正在进行的心理过程非常重要 但要捕捉这些状态并将其与特定的认知内容联系起来仍是
  • 两行Python代码实现视频负片特效

    老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 最近看到好几篇类似 n行Python代码 的博文 看起来还挺不错 简洁 实用 传播了知识 带来了阅读量 撩动了老猿的心 决定跟风一把 推
  • sql不在范围内_SQL语法——BETWEEN 操作符选取介于两个值之间的数据范围内的值...

    BETWEEN 操作符在 WHERE 子句中使用 作用是选取介于两个值之间的数据范围内的值 SQL BETWEEN 语法 演示数据库 BETWEEN 操作符实例 现在 我们希望获取 Students hobby t 表中 Age字段值 14
  • 喜报|众享链网荣获NIISA联盟2021年度技术创新奖特等奖

    2022年9月30日 互联网数据中心产业创新战略联盟 以下简称NIISA联盟 公布了2021年度技术创新奖 国内首个分布式共治的产业级联盟链体系 众享链网荣获NIISA联盟2021年度技术创新奖信息基础平台特等奖 2021年度技术创新奖项评
  • 1006 Sign In and Sign Out (25分) PAT甲级

    1006 Sign In and Sign Out 25分 At the beginning of every day the first person who signs in the computer room will unlock
  • layui树形渲染、layui树形后端返回类型、layui树形属性设置

    最近工作老是和layui打交道 躺过了坑有必要记录一下 下面直接上代码 前端 ajax type get url g const orb url api v1 department companyCode equipment deptIds
  • 2、哪些机器学习算法不需要做归一化处理?

    在实际应用中 通过梯度下降法求解的模型一般都是需要归一化的 比如线性回归 logistic回归 KNN SVM 神经网络等模型 但树形模型不需要归一化 因为它们不关心变量的值 而是关心变量的分布和变量之间的条件概率 如决策树 随机森林 Ra
  • 【云原生之kubernetes实战】在kuboard容器管理平台部署flaskapp

    云原生之kubernetes实战 在kuboard容器管理平台部署flaskapp 一 登录kuboard平台 二 创建命名空间 三 创建工作负载 1 进入到flask命名空间 2 创建工作负载 depoyment配置信息 3 创建工作负载
  • 微服务体系<2> ribbon

    1 什么是负载均衡 比如说像这样 一个请求打在了nginx上 基于nginx进行负载分流 这就是负载均衡 但是负载均衡分 服务端负载均衡和客户端负载均衡 客户端负载均衡 我user 从注册中心拉取服务 拉取order列表 然后发起getOn
  • QPainter 画扇形

    void Widget paintEvent QPaintEvent event QPainter painter this painter setRenderHint QPainter Antialiasing true painter
  • 多线程、反射

    目录 线程 实现线程 死锁 反射 注解 多线程 在Java思想中 将并发完成的每一件事情称为线程 java语言提供了并发机制 程序猿可以在程序中执行多个线程 每一个线程完成一个功能 并与其他线程并发执行 这种机制称为多线程 一个简单的线程代