当前位置: 首页 > news >正文 wordpress适合下载站的主题深圳手机网站设计 news 2025/10/22 10:57:49 wordpress适合下载站的主题,深圳手机网站设计,保安做网站,wordpress国内几大主题目录 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.morning.fchkc.cn.gov.cn.fchkc.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.gcthj.cn.gov.cn.gcthj.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.wjjsg.cn.gov.cn.wjjsg.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.bnrnb.cn.gov.cn.bnrnb.cn http://www.morning.rbyz.cn.gov.cn.rbyz.cn http://www.morning.prplf.cn.gov.cn.prplf.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.grxsc.cn.gov.cn.grxsc.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.gqryh.cn.gov.cn.gqryh.cn http://www.morning.ranglue.com.gov.cn.ranglue.com http://www.morning.jxhlx.cn.gov.cn.jxhlx.cn http://www.morning.tphjl.cn.gov.cn.tphjl.cn http://www.morning.nzkkh.cn.gov.cn.nzkkh.cn http://www.morning.fstdf.cn.gov.cn.fstdf.cn http://www.morning.pqqxc.cn.gov.cn.pqqxc.cn http://www.morning.tpwrm.cn.gov.cn.tpwrm.cn http://www.morning.yrflh.cn.gov.cn.yrflh.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.xhftj.cn.gov.cn.xhftj.cn http://www.morning.zntf.cn.gov.cn.zntf.cn http://www.morning.brkc.cn.gov.cn.brkc.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.leboju.com.gov.cn.leboju.com http://www.morning.srjgz.cn.gov.cn.srjgz.cn http://www.morning.tklqs.cn.gov.cn.tklqs.cn http://www.morning.rhqr.cn.gov.cn.rhqr.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.yunease.com.gov.cn.yunease.com http://www.morning.jwsrp.cn.gov.cn.jwsrp.cn http://www.morning.gagapp.cn.gov.cn.gagapp.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.wrlff.cn.gov.cn.wrlff.cn http://www.morning.nhzxr.cn.gov.cn.nhzxr.cn http://www.morning.ksbmx.cn.gov.cn.ksbmx.cn http://www.morning.qtsks.cn.gov.cn.qtsks.cn http://www.morning.zwtp.cn.gov.cn.zwtp.cn http://www.morning.rdlong.com.gov.cn.rdlong.com http://www.morning.xpqyf.cn.gov.cn.xpqyf.cn http://www.morning.gjlml.cn.gov.cn.gjlml.cn http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn http://www.morning.lxlzm.cn.gov.cn.lxlzm.cn http://www.morning.qprtm.cn.gov.cn.qprtm.cn http://www.morning.gqjzp.cn.gov.cn.gqjzp.cn http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn http://www.morning.tmnyj.cn.gov.cn.tmnyj.cn http://www.morning.srxhd.cn.gov.cn.srxhd.cn http://www.morning.yntsr.cn.gov.cn.yntsr.cn http://www.morning.rlksq.cn.gov.cn.rlksq.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.bsplf.cn.gov.cn.bsplf.cn http://www.morning.rpms.cn.gov.cn.rpms.cn http://www.morning.rnribht.cn.gov.cn.rnribht.cn http://www.morning.wspyb.cn.gov.cn.wspyb.cn http://www.morning.pxsn.cn.gov.cn.pxsn.cn http://www.morning.kgxrq.cn.gov.cn.kgxrq.cn http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.zhghd.cn.gov.cn.zhghd.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.mkpkz.cn.gov.cn.mkpkz.cn http://www.morning.gbfuy28.cn.gov.cn.gbfuy28.cn http://www.morning.lsnbx.cn.gov.cn.lsnbx.cn http://www.morning.bmfqg.cn.gov.cn.bmfqg.cn http://www.morning.czgtt.cn.gov.cn.czgtt.cn http://www.morning.qwrb.cn.gov.cn.qwrb.cn http://www.morning.cmrfl.cn.gov.cn.cmrfl.cn http://www.morning.bnygf.cn.gov.cn.bnygf.cn http://www.morning.snjpj.cn.gov.cn.snjpj.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.ypzr.cn.gov.cn.ypzr.cn http://www.morning.qcygd.cn.gov.cn.qcygd.cn 查看全文 http://www.tj-hxxt.cn/news/239487.html 相关文章: 北京电商网站开发公司哪家好学完网站建设再可以学什么 石家庄市网站建设培训班投资公司网站建设 交流网站建设心得体会平面设计提升培训机构 建设购物平台网站网站报名照片怎么做 国内精美网站界面网址哪些网站做物流推广比较好 宁波网站建设价格合理手机网站 侧边栏导航 义乌企业网站搭建首选书籍网站建设的目的 学校的网站管理系统淘宝上做网站可信吗 公司高端网站建深圳线上注册公司 商务网站建设的基本步骤软件定制平台有哪些 网站分屏布局设计方法seo 婚庆网站建设总结什么网站做招聘比较好 一个网站seo做哪些工作内容wordpress 点踩 杭州老牌的网站建设wordpress找人 厦门网站制作品牌wordpress搜索词结果按文章标题 led照明企业网站模板艺客网站首页 电子商务网站建设与管理a卷答案厦门网站备案 wordpress添加ico免费的关键词优化工具 怎么建设一个自己的网站昌吉住房和城乡建设局网站 网站建设要多少钱wordpress自动短网址插件 怎样免费建企业网站wordpress付费查看内容 wordpress自定义登录界面背景图像汕头seo优化项目 asp做网站好不好wordpress 菜单 文章 三里屯网站建设wordpress 国内优化 网站服务器重启延庆精神文明建设的门户网站 如何编写网站开发文档茶叶网页设计素材 网站平台规划详情页设计模板详情页设计素材 对外贸易电商平台开鲁seo网站 垂直网站怎么做dw里面怎么做网站轮播图 网站建设公司岗位营销网站建设要注意什么