• 线程


    一、进程

    1.定义:运行中的程序

    2.特点:独立性、动态性、并发性

    二、线程

    1.定义:进程中独立运行的代码片段

    2.特点:无单独内存、成本低

    三、并发

    1.定义:即时只有一个cpu,多个进程(线程)在cpu上快速轮换。

    2.特点:同一个cpu,同一时间只有一个进程(线程)运行,其它的在等待,假同时。

    四、并行

    1.定义:同一时间,多个cpu执行多个进程(线程)。

    2.特点:互不干扰,真正同时。

    五、多线程好处

    1.功能上与多进程类似。

    2.成本低,效率高。

    3.线程共享进程内存,通信方便。

    六、后台线程

    1.当所有的前台线程结束时,后台线程就死亡(GC);

    2.设置:setDaemon(true)。

    七、线程的创建与启动

    1.继承Thread类(单继承,无法继承其他类)

    1)重写run()方法

    2)调用start()方法启动线程

    3)无返回值,不能抛出异常,因为是覆盖

    2.实现Runnable接口

    1)重写run()方法

    2)调用start()方法启动线程

    3)把Runnable对象包装成Thread对象,实现了代码与数据的分离,逻辑更清楚,可以继承其他类。

    3.实现Callable接口

    1)重写call()方法,有返回值,抛异常。

    2)把Callable对象包装成Runnable子类的对象,实现了代码与数据的分离,逻辑更清楚,可以继承其他类。

    注意点:

    1)多进程:一个操作系统下不同任务,执行不同的程序

    2)多线程:一个任务拆成多个子任务,提高效率

    3)主线程:执行方法体main()方法

    4)主线程死亡,非后台线程依然执行。

    补充:

    抢占式:多个线程都可以运行但只有一个线程正在运行。“可运行状态”和“运行状态”。

    时间片式:为每个线程分配等量的cpu时间的过程

    4.代码实现

    package 线程;
    
    public class HelloRunner implements Runnable{
        int i;
        public void run() {
            Thread td = Thread.currentThread();
            String name = td.getName();//获取线程名称
            for(i = 0;i<100;i++){
                System.out.println("["+name+"]**"+i);
            }
        }
    
    }
    package 线程;
    
    public class TestTHread {
        public static void main(String[] args) {
            Runnable r = new HelloRunner();
            Thread t = new Thread(r);    //创建线程
            t.start();                    //启动线程
            
            Thread td = Thread.currentThread();
            String name = td.getName();//获取线程名称
            for(int i =0;i<100;i++){
                System.out.println("["+name+"]---"+i);
            }
        }
    }

    5.线程结束

    package 线程;
    
    public class HelloRunner implements Runnable{
        int i;
        private boolean stopFlag = false;
        public void run() {
            Thread td = Thread.currentThread();
            String name = td.getName();//获取线程名称
            for(i = 0;i<100;i++){
                System.out.println("["+name+"]**"+i);
            }
            
            while(!stopFlag){
                System.out.print((i++) + "   ");
                if(i>500){
                    i = 0;
                }
            }
            
        }
        public void setStopFlag(boolean stopFlag){
            this.stopFlag=stopFlag;
        }
    }
    package 线程;
    
    public class TestTHread {
        public static void main(String[] args) {
            Runnable r = new HelloRunner();
            Thread t = new Thread(r);    //创建线程
            t.start();                    //启动线程
            
            Thread td = Thread.currentThread();
            String name = td.getName();//获取线程名称
            for(int i =0;i<100;i++){
                System.out.println("["+name+"]---"+i);
            }
            HelloRunner hr = new HelloRunner();
            hr.setStopFlag(true);
        }
    }

    6.继承Thread

    package 线程;
    
    public class HelloThread extends Thread{
        int i;
        @Override
        public void run() {
            for(i=0;i<100;i++){
                System.out.println("---"+i);
            }
        }
        public static void main(String[] args) {
            Thread t = new HelloThread();
            t.start();
        }
    }

    八、方式比较

    1.实现Runnable接口

    1)更好的面向对象设计

    2)可以继承其他类

    3)保持了模块功能的独立性

    2.继承Thread

    1)代码更简洁

    九、线程控制

    1.sleep方法

    1)使用:Thread.sleep(100);//睡眠100毫秒

    2)唤醒方式:

      主动唤醒-到达指定睡眠时间

      被动唤醒-调用interrupt方法,收到InterruptedException异常

    2.jion方法(实例方法)

    1)jion方法有重载方法可以使用,以允许指定线程最小等待时间。

    2)唤醒方式:

      线程结束唤醒-当所有jion的线程运行结束后

      主动唤醒-到达指定睡眠时间

      被动唤醒-调用interrupt方法,收到InterruptedException异常

    3.线程阻塞状态

    新建->start()->可运行<---调度任务--> 正在运行->run()完成->终止

    正在运行---阻塞事件(sleep,join)----->阻塞-----解除阻塞---->可运行

    4.方法使用

    package 线程;
    
    public class sleepandjion {
        public static void main(String[] args) {
            Thread t = new Thread();
            try {
                t.sleep(1000);
                t.join();
                t.join(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
  • 相关阅读:
    [BZOJ2118/Luogu2371][国家集训队]墨墨的等式
    [BZOJ2742/Luogu4598][HEOI2012]Akai的数学作业
    [POJ3734]Blocks
    [BZOJ3028]食物
    [BZOJ1537/Luogu3431][POI2005]AUT-The Bus
    [BZOJ1452/Luogu4054][JSOI2009]Count计数问题
    [BZOJ1625][Usaco2007 Dec]宝石手镯
    [BZOJ2060/Luogu2996][USACO10NOV]拜访奶牛Visiting Cows
    React-Native style 中 justifyContent:'flex-end' 单独使用不工作
    IIS站点下,React重新刷新,404问题的解决
  • 原文地址:https://www.cnblogs.com/zdf159/p/7268734.html
Copyright © 2020-2023  润新知