• 多线程的基本实现


    进程:程序的执行过程(动态性);

               持有资源(内存)和线程(载体); 

    线程:是一份程序里面不同的执行路径。

              线程共享进程的资源

              同一个进程有多个线程

              线程是系统中最小的执行单位

    线程与进程的区别:

      多进程:在操作系统中能同时运行多个任务

      多线程:在同一应用程序中有多个数据流同时执行

           线程的交互:互斥、合作

      当一个线程休眠后另一个才获得处理器;

    通过继承Thread类或Runnable接口,然后重写run方法实现多线程

    能使用Runnable接口就不要使用Thread继承

    补充:isAlive( )   //判断线程是否终止

      getPriority( )   // 获得线程优先级数值

      setPriority(  )     //设置线程优先级

      Thread.sleep()         // 将当前线程睡眠指定毫秒数  静态方法

        线程优先级用数字表示是从1到10,默认为5 

    public class TestThread1 {
        public static void main(String args[]) {
            Runner1 r = new Runner1();
            r.start();
            //r.run();
            //Thread t = new Thread(r);
            //t.start();
            
            for(int i=0; i<100; i++) {
                System.out.println("Main Thread:------" + i);
            }
        }
    }
    
    //class Runner1 implements Runnable {
    class Runner1 extends Thread {
        public void run() {
            for(int i=0; i<100; i++) {    
                System.out.println("Runner1 :" + i);
            }
        }
    }

    调用start方法是两个线程同步完成即交替运行;交替输出

    调用run方法则是顺序执行;输出完一个才输出另一个

    军队类:

    import java.lang.invoke.VolatileCallSite;
    
    public class ArmyRunnable implements Runnable {
        volatile boolean running = true;
        public void run() {
            while(running){
               for(int i=0;i<5;i++){
                   System.out.println(Thread.currentThread().getName()+"第["+i+"]次攻击");//获得当前线程的引用
                   Thread.yield();//当前运行线程释放处理器资源
               }
            }
            System.out.println(Thread.currentThread().getName()+"结束了战斗");
        }
    }

    关键人物类:

    public class KeyPerson extends Thread {
        public void run(){
            System.out.println(Thread.currentThread().getName()+"开始了战斗!");
            for(int i=0;i<10;i++){
                System.out.println(Thread.currentThread().getName()+"左突右杀,攻击隋军...");
            }
            System.out.println(Thread.currentThread().getName()+"结束了战斗!");
        }
    }

    舞台类:

    public class Stage extends Thread{
        public void run() {
            System.out.println("欢迎观看隋唐演义");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("大幕徐徐拉开");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("话说隋朝末年,隋军与农民军杀的天昏地暗");
            
            ArmyRunnable SuiDynasty=new ArmyRunnable();
            ArmyRunnable Fammer=new ArmyRunnable();
            Thread ArmySuiDynasty=new Thread(SuiDynasty,"隋军");
            Thread ArmyFammer=new Thread(Fammer,"农民起义军");
            ArmySuiDynasty.start();
            ArmyFammer.start();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("正当双方激战正酣,半路杀出来个程咬金");
            Thread MrCheng=new KeyPerson();
            MrCheng.setName("程咬金");
            System.out.println("程咬金的理想就是结束战争使百姓安居乐业");
            SuiDynasty.running=false;
            Fammer.running=false;
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MrCheng.start();
            try {
                MrCheng.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("程咬金实现了他的理想百姓安居乐业");
            System.out.println("谢谢观看");
        }
        public static void main(String[] args) {
            new Stage().run();
        }
    }

    线程停止的正确方法为设置旗标如上例中running

    不正确的:

          1.stop方法是不正常的停止方法不能使用,它会使程序戛然而止

          2.interrupt方法不能正确的停止,它的初衷不是用于停止线程。

           它不能与sleep(),join()一起使用 , 会产生错误:1.程序中断状态被清除   2.将收到InterruptedException

            interrupted()和isInterrupted()方法返回的是boolean

    例:

    public class WrongWayThread extends Thread {
        public static void main(String[] args) {
            WrongWayThread thread=new WrongWayThread();
            System.out.println("start thread...");
            thread.start();
            try {
                thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("interrupting thread");
            thread.interrupt();
            try {
                thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("stop application");
        }
      public void run(){
            while(!this.isInterrupted()){
                System.out.println("thread is running");
                long time=System.currentTimeMillis();
                while(System.currentTimeMillis()-time<1000){
                    //降低输出速度的空循环
                }
            }
        }
    }
  • 相关阅读:
    JSON.parse(JSON.stringify()) 实现对对象的深拷贝
    Promise 多重链式调用
    qs.parse() 和 qs.stringfy() 之 传输数据秘籍
    js 递归思想 处理后台多维数组的数据 之 完美契合
    js 反转字符串的实现
    js 中的! 和 !! 的区别
    vue 权限管理深度探究
    Web 前端 中高难度问题(希望看完之后的你可以拿到Offer^v^)
    vue懒加载 路由 router 的编写(resolve)
    Efficiency in Shell
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/7263279.html
Copyright © 2020-2023  润新知