zoukankan      html  css  js  c++  java
  • 多线程

    多线程介绍
    学习多线程之前,我们先要了解几个关于多线程有关的概念。
    进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
    
    什么是多线程呢?即就是一个程序中有多个线程在同时执行。
    通过下图来区别单线程程序与多线程程序的不同:
    单线程程序:即,若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。如,去网吧上网,网吧只能让一个人上网,当这个人下机后,下一个人才能上网。
    多线程程序:即,若有多个任务可以同时执行。如,去网吧上网,网吧能够让多个人同时上网。
    例子:
    public class Demo01 {
        //主线程 :程序从上往下执行的过程  
        //javac编译Demo01
        //JVM 运行你的Demo01的main方法  找操作系统OS 开启线程
        //对于CPU来说就是有一条执行路径  运行方法main的这条路径有个名字叫"main"即主线程
        public static void main(String[] args) {
            System.out.println(0/0);
            method1();
        }
        public static void method1(){
            for(int i=0;i<1000;i++){
                System.out.println(i);
            }
        }
    }
    程序运行原理
    分时调度
    所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
    抢占式调度
    优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
    
    创建新执行线程有两种方法。
    一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。
    另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。
    方式一:Thread类
    构造方法
    常用方法
    public class ThreadDemo extends Thread{
        public ThreadDemo(){}
        public ThreadDemo(String name){
            super(name);
        }
        public void run() {
            //System.out.println(getName());//获取线程名字
            for(int i=0;i<100;i++){
                try {
                    sleep(1000);//休眠
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(i);
            }
        }
    }
    public class Test {
        //开线程的第一种方法
        //1.定义Thread子类,继承Thread  重写run方法
        //2.在测试类中,创建Thread子对象
        //3.用子类对象调用start方法  只能调用一次
        public static void main(String[] args) {
            //创建线程对象
            ThreadDemo td=new ThreadDemo();
            //开启线程   start:1.让线程执行  2.让JVM调用线程中的run方法
            td.start();
            /*for(int i=0;i<100;i++){
                System.out.println(i+"主");
            }*/
            //获取主线程名字
            Thread td2=Thread.currentThread();
            System.out.println(td2.getName());//main
        }
    }
    public class Test1 {
        public static void main(String[] args) {
            ThreadDemo td=new ThreadDemo("小野爹");
            //设置线程名称
            td.setName("小野猪");
            //开启线程
            td.start();
        }
    }
    public class Test2 {
        //休眠一秒执行
        public static void main(String[] args) {
            ThreadDemo td=new ThreadDemo();
            td.start();
        }
    }
    方式二:实现Runnable接口
    接口中的方法
    Thread类构造方法
    public class MyRunable implements Runnable{
        public void run(){
            for(int i=0;i<100;i++){
                System.out.println(Thread.currentThread().getName()+" "+i);
            }
        }
    }
    public class Test {
        //第二种创建线程的方式
        //1.创建实现类,实习Runnable接口,重写run方法
        //2.在测试类中创建实现类对象,创建线程对象,将实现类对象传入线程对象的构造方法
        //3.用线程对象开启线程
        //高内聚,低耦合
        public static void main(String[] args) {
            //创建线程任务对象
            MyRunable mr=new MyRunable();
            //创建线程对象
            Thread t1=new Thread(mr);
            //开启线程
            t1.start();
            Thread t2=new Thread(mr);
            t2.start();
        }
    }
    线程的匿名内部类使用
    public class Demo01 {
        //匿名内部类
        //new 抽象类接口(){
            //重写父类方法
        //}.子类独有的方法
        public static void main(String[] args) {
            //多态定义一个runnable实现类对象
            //来描述线程任务
            Runnable r=new Runnable(){
                public void run() {
                    System.out.println("1");
                }
            };
            //创建线程
            Thread t=new Thread(r);
            //开启线程
            t.start();
            //也可以一句话实现
            new Thread(new Runnable(){
                public void run() {
                    System.out.println("2");
                }
            }).start();
        }
    }
  • 相关阅读:
    查询语句
    索引的增删改成查
    pymysql模块
    mysql备份
    单表查询语法
    单表查询
    mysql增删改差
    Leetcode--1. Two Sum(easy)
    Leetcod--20. Valid Parentheses(极简洁的括号匹配)
    Leetcode-448. Find All Numbers Disappeared in an Array(solve without extra space easy)
  • 原文地址:https://www.cnblogs.com/zhaotao11/p/10250428.html
Copyright © 2011-2022 走看看