当前位置: 首页 > news >正文

网站建设 常用字体可视化网页制作工具

网站建设 常用字体,可视化网页制作工具,家装室内设计案例分析图文,手工制作头饰目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用… 目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象并命名当前线程名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象并命名Thread(ThreadGroup group,Runnable target)线程可以被用来分组管理分好的组即为线程组 Thread 的常见属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDaemon()是否存活isAlive()是否被中断isInterrupted() 解释 ID 是线程的唯一标识不同线程不会重复但是这里的id是Java给的id不是前面PCB中说的id。名称在各种调试工具用到前面构造方法给的名称就是这个。状态表示线程当前所处的一个情况。优先级高的线程理论上来说更容易被调度到但是这个是系统微观程度上的很难感知到。关于后台线程需要记住一点JVM会在一个进程的所有非后台线程(前台线程)结束后才会结束运行而后台线程不影响Java进程的结束可以在start()调用前使用setDaemon(true)来设置线程为后台线程。是否存活即简单的理解为 run 方法是否运行结束了 创建一个线程 在前一篇文章中就介绍了相关操作在这简单提一下一定要使用线程变量名.start();创建一个新线程start()方法是Java提供的API来调用系统中创建线程的方法。而run()方法是这个线程要干的事情在线程创建好之后自动就会调用。 每个线程对象只能start一次。 获取当前线程引用 方法说明public static Thread currentThread();返回当前线程对象的引用 是静态方法直接使用Thread.currentThread();就可以获取到当前的线程引用。 终止一个线程 在Java中终止一个线程的思路就是让线程中的run()方法尽快结束。 使用标志位 由于线程迟迟不结束大多是因为里面有循环语句我们就可以使用一个成员变量来控制循环的结束。 不能使用局部变量定义在main方法内因为虽然lambda表达式可以捕获上层变量但是这个变量不可以进行修改。 public class Demo {private static boolean isQuit false;public static void main(String[] args) {Thread thread new Thread(() -{while(isQuit) {//具体操作 }});thread.start();isQuit true;} }使用自带的标志位 方法说明public void interrupt()中断对象关联的线程如果线程正在阻塞则以异常方式通知否则设置标志位public static boolean interrupted()判断当前线程的中断标志位是否设置调用后清除标志位不建议使用静态方法为所有线程共用的public boolean isInterrupted()判断对象关联的线程的标志位是否设置调用后不清除标志位 Java中自带了标志位来标志是否结束循环。先使用Thread.currentThread()获取到当前线程在.isInterrupted()获取标志位。然后再主进程中调用interrupte()方法来将标志位值修改为true。 public class Demo {public static void main(String[] args) {Thread thread new Thread(() -{while (!Thread.currentThread().isInterrupted()) {//操作}});thread.start();thread.interrupt();} }但是如果在线程中有捕获InterruptedException异常的语句那么会在调用interrupte()同时捕获到该异常并且消除标志位。 此时我们就可以在catch语句中自己选择是将线程结束还是进行其它操作。 public class Demo {public static void main(String[] args) {Thread thread new Thread(() -{while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(1000);} catch (InterruptedException e) {//1.不操作继续执行线程e.printStackTrace();//2.结束线程break;//3.进行其它操作}}});thread.start();thread.interrupt();} } 等待一个线程 方法说明public void join()等待线程结束public void join(long millis)等待线程结束最多等 millis 毫秒public void join(long millis, int nanos)等待线程结束最多等 millis 毫秒但可以更高精度 在主线程中调用线程对象.join();就是等待线程对象执行完再执行主线程。 调用细节 调用线程对象.join();就会让该线程执行完才继续执行外面的线程如果线程对象对应的线程一直不结束那么外面的线程就会一直等死等调用线程对象.join(long millis);就会在该线程执行millis毫秒后执行外面的线程。如果遇到调用join前线程已经结束外面的线程不会陷入等待。 如下代码执行结果就是先打印5个thread线程最后在打印main线程 public class Demo6 {public static void main(String[] args) throws InterruptedException {Thread thread new Thread(() - {for(int i 0; i 5; i) {System.out.println(thread线程);}}); thread。start();thread.join();System.out.println(main线程);} } 线程休眠 方法说明public static void sleep(long millis) throws InterruptedException休眠当前线程 millis毫秒public static void sleep(long millis, int nanos) throws InterruptedException可以更高精度的休眠 在系统让线程休眠sleep中的参数毫秒后线程会被唤醒从阻塞状态变成就绪状态但不会马上执行涉及到调度开销。所以实际使用的时间是大于sleep中的参数的。 并且在Windows和Linux系统上达到毫秒级误差。 线程状态 在操作系统里面进程和线程最重要的状态就是就绪状态和阻塞状态。 在Java中又给线程又给线程赋予了一些其他状态。 线程的状态是一个枚举类型 Thread.State。 状态说明newThread对象已经创建但是start方法没有调用terminatedThread对象还在但是内核中线程已将结束了Runnable就绪状态线程已经在CPU上执行或者在CPU上等待执行timed_waiting由于sleep这种固定时间产生的阻塞waiting由于wait这种不固定时间产生的阻塞blocked由于锁竞争产生的阻塞 线程安全 线程安全的简单说法就是符不符合预期如果多线程环境下代码运行的结果是符合我们预期的即在单线程环境应该的结果则说这个程序是线程安全的。 例如以下代码 我们的预期结果是10000但是其实每次的结果都是不一样的这种就是线程不安全。 public class Demo {private static int ret;public static void main(String[] args) throws InterruptedException {Thread thread1 new Thread(() - {for (int i 0; i 5000; i) {ret;}});Thread thread2 new Thread(() - {for (int i 0; i 5000; i) {ret;}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println(ret);;} }就以上诉代码例子来讲解出现线程不安全的原因。 在CPU上实现自增操作主要有三步 将数据给到CPU的寄存器中数据在寄存器中加1将数据返回到内存中。 就以一个thread1和一个thread2来说每个线程都进行这三步操作但是线程在CPU上又是随机调用的这就相当于有六个位置随机坐相当于排列组合的A66当数据作为不同线程的开始值进入寄存器时就相当于两次自增只执行了一次。 但是线程调用就更加复杂了线程数量不一样顺序不一样这就相当于有无数种可能了所以结果是不可控的就导致了线程不安全的情况。 线程不安全原因总结 在介绍线程不安全原因之前先介绍一个概念原子性。 原子性简单来讲就是执行一段代码连续执行完不被其他线程干扰。举个例子 我们把一段代码想象成一个房间每个线程就是要进入这个房间的人。如果没有任何机制保证A进入房间之后还没有出来B 是不是也可以进入房间打断 A 在房间里的隐私。这个就是不具备原子性的。 那我们应该如何解决这个问题呢是不是只要给房间加一把锁A 进去就把门锁上其他人是不是就进不来了。这样就保证了这段代码的原子性了。 有时也把这个现象叫做同步互斥表示操作是互相排斥的。 原因总结 操作系统调度线程是随机的抢占式执行多个线程对同一个变量进行修改修改操作不是原子性的内存可见性问题指令重排序问题。 解决由先前线程不安全问题例子 要解决就要从原因入手 操作系统随机调度是操作系统带来的解决不了多个线程对一个变量修改有些可以规避但有些根据需求无法规避。将操作改为原子性可以通过synchronized关键字 加锁操作来实现。 语法 synchronized(变量){ //修改操作 }()括号内的变量不重要作用是区分加锁对象是否一样如果对同一个对象加锁那么两个操作就会产生“blocked”锁竞争阻塞问题后一个线程就会等到前一个线程解锁再执行。 进入左大括号 ‘{’ 就是加锁出了右大括号 ‘}’ 就是解锁。 对上诉代码进行如下修改就会出现预期结果10000: public class Demo7 {private static int ret;public static void main(String[] args) throws InterruptedException {Object block new Object();Thread thread1 new Thread(() - {for (int i 0; i 5000; i) {synchronized (block){ret;}}});Thread thread2 new Thread(() - {for (int i 0; i 5000; i) {synchronized (block){ret;}}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println(ret);;} }synchronized还可以修饰方法静态方法也行。 synchronized修饰实例方法 class Counter{public int ret;public void increase1() {synchronized (this) {ret;}}//简化版本synchronized public void increase2() {ret;} }synchronized修饰静态方法相当于修饰这个类 class Counter{private static int ret2;public static void increase3() {synchronized (Counter.class) {ret2;}}//简化版本synchronized public static void increase4() {ret2;} }
http://www.sczhlp.com/news/175394/

相关文章:

  • 基于jsp的网站开发的文献网站源码怎么绑定域名
  • 2025电源适配器最新推荐榜:高效稳定与安全性能兼备的优质之
  • 【光照】Unity[光照烘焙]的原理与具体流程
  • 2025 最新推荐!办公桌厂商权威榜单重磅发布,涵盖老板 / 员工 / 实木 / 屏风办公桌优质之选
  • 2025 办公家具厂家最新推荐榜:实木 / 现代 / 环保 / 智能 / 定制品类精英盘点,5 大优选品牌选购指南
  • 做视频网站视频存放问题返利网站做淘宝
  • 西安建设局网站小孩把沧州公司官网
  • 做冻品海鲜比较大的网站有哪些seo网站推广方法
  • 做网站用什么软件免费建筑公司企业愿景范文简短
  • 商城网站页面模板广东东莞最新新闻
  • 淘宝联盟 网站建设 内容少公司网站后台怎么上传图片
  • 营销型网站建设的5大技巧仙游县建设局网站
  • 徐州建站服务宁波seo哪家好推广
  • 网站流量共享芜湖市建设工程质量监督站网站
  • 做合法的海外购网站需要什么手续thinkphp怎么做网站
  • 孟村县做网站安徽品质网站建设创新
  • 资讯网站模板网站如何申请域名
  • 辽宁省精神文明建设工作三大创建活动网站青岛网站做网站多少钱
  • 怎么做网站页面免费的电子商务网站如何推广
  • 中文网站常用字体做音乐网站多少钱
  • 运城网站制作设计网站官网入口
  • 韶关营销网站开发山西省建设工程信息网站
  • 做淘宝客的网站怎么备案综合网站开发
  • 洛阳霞光高端定制网站建设宜昌做网站
  • 南通网站建设排名公司哪家好wordpress优化主题
  • 网站建设用什么语言军事新闻头条
  • 西安西工大软件园做网站的公司移动app设计网站建设
  • 网站设计及内容策划宿迁网站建设SEO优化营销
  • 2025 振动盘厂家最新推荐榜单:涵盖精密 / 电子 / 定制等多场景,揭秘市场信赖品牌选择秘籍笔筒振动盘/振动盘定做/橡胶振动盘厂家推荐
  • 2025 年震动盘厂家最新推荐榜单:覆盖精密震动盘 / 电子震动盘 / 塑料震动盘等品类,为企业高效选型提供权威参考