zoukankan      html  css  js  c++  java
  • 线程常见方法

    方法


         sleep:当前线程暂停

      join:将该线程加入到当前线程中,默认是main

      setPriority:设置优先级

      yield:临时暂停

      setDaemon:守护线程

    sleep-睡觉


       让该线程每运行一次就暂停一秒

    package com.thread.thread4;
    
    public class TestThread {
        public static void main(String[] args) {
            Thread t1 = new Thread() {  //内部类创建线程对象
                public void run() {
                    int seconds = 0;  //创建时间变量
                    while (true) {
                        try {
                            Thread.sleep(1000);  //让线程休息1秒钟
                        }catch(InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.printf("已经完了lol %d 秒 %n", seconds++);   //执行一次就+1
                    }
                }
            };
            t1.start();  //启动线程
        }
    }

      从结果可以看出,每次运行耗时一秒

    Join-插队


      两个线程在一个主线程中同时运行,它的顺序是乱的

      使用A.join(),那么就只有等A线程全部运行完了之后,才会运行其他线程

    package com.thread.thread5;
    
    import com.thread.Hero;
    
    public class TestThread {
        public static void main(String[] args) {
            final Hero gareen = new Hero();
            gareen.name = "盖伦";
            gareen.hp = 616;
            gareen.damage = 50;
    
            Hero teemo = new Hero();
            teemo.name = "提莫";
            teemo.hp = 300;
            teemo.damage = 30;
    
            Hero bh = new Hero();
            bh.name = "赏金猎人";
            bh.hp = 500;
            bh.damage = 65;
    
            Hero leession = new Hero();
            leession.name = "盲僧";
            leession.hp = 445;
            leession.damage = 80;
    
    //        Thread类实现的Runnable接口
            Thread t1 = new Thread() {  //创建线程
                public void run() {  //重新写run方法
                    while(!teemo.isDead()) {
                        gareen.attackHero(teemo);  //调用对象的方法  某某攻击某某
                        System.out.println("我是t1");
                    }
                }
            };
            t1.start();
    
            //代码执行到这里  一直是main线程在执行
            try{
                //t1线程加入到main线程中来  只有t1线程运行结束  才会继续往下走
                t1.join();
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
            Thread t2 = new Thread(){
                public void run() {
                    while(!leession.isDead()){
                        bh.attackHero(leession);
                    }
                }
            };
            //会观察到t1线程运行完成之后 才执行的t2线程
            t2.start();
        }
    }

      从效果看出,的确t1执行完全才轮到t2上

    setPriority-优先级


        这个优先级只能说是抢占cpu资源的概率变大了,其他线程来捣乱的几率还是有的

    package com.thread.thread6;
    
    import com.thread.Hero;
    
    public class TestThread {
        public static void main(String[] args) {
            final Hero gareen = new Hero();
            gareen.name = "盖伦";
            gareen.hp = 616;
            gareen.damage = 50;
    
            Hero teemo = new Hero();
            teemo.name = "提莫";
            teemo.hp = 300;
            teemo.damage = 30;
    
            Hero bh = new Hero();
            bh.name = "赏金猎人";
            bh.hp = 500;
            bh.damage = 65;
    
            Hero leession = new Hero();
            leession.name = "盲僧";
            leession.hp = 445;
            leession.damage = 80;
    
            Thread t1 = new Thread() {   //创建线程
                public void run() {
                    while(!teemo.isDead()) {
                        gareen.attackHero(teemo);
                    }
                }
            };
    
            Thread t2 = new Thread() {
                public void run() {
                    while(!leession.isDead()) {
                        bh.attackHero(leession);
                    }
                }
            };
            //这个优先级 只能说更大的概率  线程能够抢占到cpu资源 还是有部分的线程会抢占执行
           // t1.setPriority(Thread.MAX_PRIORITY);   //给线程设置最大优先级别
            t1.setPriority(Thread.MIN_PRIORITY);   //最小优先级
            t1.start();
            t2.start();
        }
    }

      看到t1的优先级设置到最低,但是在t2执行的时候还是会去捣乱

    yield-暂停


        线程2进行暂停操作

    package com.thread.thread7;
    
    import com.thread.Hero;
    
    public class TestThread {
        public static void main(String[] args) {
            final Hero gareen = new Hero();
            gareen.name = "盖伦";
            gareen.hp = 61600;
            gareen.damage = 50;
    
            Hero teemo = new Hero();
            teemo.name = "提莫";
            teemo.hp = 30000;
            teemo.damage = 30;
    
            Hero bh = new Hero();
            bh.name = "赏金猎人";
            bh.hp = 50000;
            bh.damage = 65;
    
            Hero leession = new Hero();
            leession.name = "盲僧";
            leession.hp = 44500;
            leession.damage = 80;
    
            Thread t1 = new Thread() {
                public void run() {
                    while(!teemo.isDead()) {
                        gareen.attackHero(teemo);
                    }
                }
            };
            Thread t2 = new Thread() {
                public void run() {
                    while(!leession.isDead()) {
                        //临时暂停  使得t1可以占用cpu资源
                        Thread.yield();   //暂停线程  线程的暂停也只能说是一种大概率的暂停  部分线程执行还是会穿插在t1执行过程中
                        //t1执行完成之后才会完全执行t2
                        bh.attackHero(leession);
                    }
                }
            };
            t1.setPriority(5);   //设置优先级
            t2.setPriority(5);
            t1.start();  //启动线程
            t2.start();
        }
    }

      在这里我把t2盲憎给暂停了,但是t1的时候还是会出现t2的,说明暂停只是一种大概率的暂停,和优先级类似

    setDaemon-守护进程


       守护进程就是像日志一样,我们这个程序执行结束,日志自然就不再记录了。伴随着整个进程的消亡而消亡。或者说守护的东西消失了,自己的使命也就完成了。

    package com.thread.thread8;
    
    public class TestThread {
        public static void main(String[] args) {
            Thread t1 = new Thread(){
                public void run() {
                    int seconds = 0;
                    while(true) {
                        try {
                            Thread.sleep(1000);
                        }catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.printf("已经完了LOL %d 秒 %n", seconds++);
                    }
                }
            };
            t1.setDaemon(true);   //守护进程开启  这里就是相当于main主线程的守护进程   main执行成功 t1就死翘翘了
            //守护进程  从字面意思就是守护  它守护的目标死亡  他的命运就结束了
            t1.start();
    
        }
    }

      运行一片空白,这里是将t1线程作为守护线程,那么main主线程完成后,自己就死掉了。

     

  • 相关阅读:
    (转)排序算法——归并排序与递归
    在serviceImpl里使用自身的方法
    hibernate manytoone中的lazy EAGER
    autowire异常的三个情况
    (转)js的call和apply
    mysql创建外键出错(注意数据库表字段排序)
    easyui datagrid
    ava.lang.NullPointerException的一般解决方法
    spring简单事务管理器
    关于使用注解出现BeanCreationException或者NameNotFoundException的解决方法
  • 原文地址:https://www.cnblogs.com/HelloM/p/14403422.html
Copyright © 2011-2022 走看看