zoukankan      html  css  js  c++  java
  • 线程

    一、进程

    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();
            }
            
        }
    }
  • 相关阅读:
    c#的逆向工程-IL指令集
    利用nginx concat模块合并js css
    DotNetOpenAuth实践之Webform资源服务器配置
    STL使用迭代器逆向删除
    驱动安装时的错误
    How to detect the presence of the Visual C++ 2010 redistributable package
    Shell脚本使用汇总整理——文件夹及子文件备份脚本
    Shell脚本使用汇总整理
    Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本
    Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本
  • 原文地址:https://www.cnblogs.com/zdf159/p/7268734.html
Copyright © 2011-2022 走看看