学习Java的第十天

学习Java的10天

  • 程序:

    • 一组指令的集合,即指一 段静态的代码,静态对象。
  • 进程:

    • 是程序的一次执行过程,或是正在运行的一个程序。
    • 是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期
    • 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域 。
  • 线程:

    • 线程的理解

      • What:

        • 线程是比进程更小的执行单位,是在一个程序(也叫做一个进程)去处理多个任务,这一个任务就叫做线程。线程是来回切换的,需要加载哪个线程就加载哪个。

        • 线程共享电脑分配的同一块内存区间,使用相同的堆。

        • 特点:线程不能独立运行,必须依赖于进程,在进程中运行。每个程序至少有一个线程称为主线程

  • 开启多线程的优点和缺点

    • 提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。
    • 充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。
    • 当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。
    • 多个线程操作共享的内存资源,可能会带来哪个线程操作资源的问题,叫做安全隐患。
  • 线程的创建和使用 重要

  • //1.创建一个Tread类的子类
    class MyThread extends Thread {
        @Override
        public void run() {
            //2.将此线程的操作声明在run()
            for (int i = 0; i <100 ; i++) {
                if (i % 2 == 0){
                    System.out.println(i);
                }
            }
    
        }
    
    }
    
    public class ThreadTest {
        public static void main(String[] args) {
            //main方法中对应的就是主线程
            //3.创建子线程类的对象
            MyThread t1 = new MyThread();
            //4.通过子线程对象去调用start方法
            //4.1启动当前线程(相当于开始一个新的线程)
            //4.2调用当前线程的run方法
            t1.start();
            for (int i = 0; i <100 ; i++) {
            if (i % 2 != 0){
                    System.out.println(i+"mian()");
                }
            }
    
        }
    }
    
    
  • 创建多个线程去执行不同的事情

    //创建两个线程 分别输出100以内的奇数和偶数
    public class Multread {
        public static void main(String[] args) {
            new Thread() {
                @Override
                public void run() {
                    for (int i = 0; i < 100; i++) {
                        if (i % 2 == 0) {
                            System.out.println(Thread.currentThread().getName()+i);
                        }
                    }
                }
            }.start();
            new Thread() {
                @Override
                public void run() {
                    for (int i = 0; i < 100; i++) {
                        if (i % 2 != 0) {
                            System.out.println(Thread.currentThread().getName()+i);
                        }
                    }
                }
            }.start();
    
        }
    }
    
    
  • Thread中的常用方法

    • run():将创建的线程所要执行的操作声明在此方法当中
    • start():启动当前线程,调用当前线程的run()
    • getName():获取当前线程的名称
    • setName():设置当前线程的名称
    • currentThread:静态方法,返回当前执行代码的线程
    • yield():释放当前cpu的执行权。
    • join():调用该方法时,在线程a中调用线程b的join,此时线程a就进入阻塞状态,直到线程b执行完之后,线程a才开始执行。
    • stop():强制停止该线程 不建议使用该方法
    • sleep(long millitime):让当前线程睡眠指定的时间,在指定的时间内,该线程是阻塞状态。
    • isLive():判断线程是否存活。
  • 线程的调度

    • 时间片:cpu 自动切换不同的线程

    • 抢占式:高优先级抢占cpu

    • 线程的优先级等级

      • MAX_PRIORITY:10

      • MIN _PRIORITY:1

      • NORM_PRIORITY:5

      • getPriority() :获取线程优先值

      • setPriority(int newPriority) :设置线程的优先级

      • 注意:优先级高不一定优先执行,只是说优先级高的执行概率高。

        public class TreadMethod {
            public static void main(String[] args) throws InterruptedException {
                MyTread t1 = new MyTread();
                Thread.currentThread().setPriority(1);
                t1.setPriority(10);
                //设置当前线程的优先级 一般在start之前
               t1.start();
               int m = Thread.currentThread().getPriority();
               //获取当前的线程优先级 默认为2
                System.out.println(m);
                for (int i = 0; i <100 ; i++) {
                    System.out.println(i);
                    if (i == 3){
                        t1.join();
                    }
                }
        
            }
        }
        
        class MyTread extends Thread {
            @Override
            public void run(){
                for (int i = 0; i <100 ; i++) {
                    try {
                        int n = getPriority();
                        System.out.println(n);
                        sleep(2000);
                        System.out.println("睡了5秒钟");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
  • 创建多线程的方式之一--继承Thread类的方式

    class Treadtest extends Thread {
        private static int ticket = 100;
    
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                if (ticket > 0) {
                    System.out.println("这是" + getName() + "卖的票" + " 票号 " + ticket--);
    
                } else
                    break;
            }
        }
    }
    
    public class SellTicket {
        public static void main(String[] args) {
            Treadtest t1 = new Treadtest();
            Treadtest t2 = new Treadtest();
            Treadtest t3 = new Treadtest();
            t1.setName("窗口1:");
            t2.setName("窗口2:");
            t3.setName("窗口3:");
            t1.start();
            t2.start();
            t3.start();
        }
    }
    
    
  • 创建多线程的方式之二--实现了runnnable接口的类

    • 创建一个实现了runnnable接口的类

    • 实现类去实现runnable中的抽象方法 run()

    • 创建实现类的对象

    • 将此对象作为参数传递到Tread类的构造器当中,创建

      Tread类的对象。

    • 通过Thread类的对象调用start()

    class Mythread implements Runnable{
    //创建一个runnable的实现类
        @Override
        public void run() {
            for (int i = 0; i <100 ; i++) {
               if (i % 2 == 0 ){
                   System.out.println(i);
               }
            }
        }
    }
    public class Test {
        public static void main(String[] args) {
            //2.创造此实现类的对象
            Mythread mythread = new Mythread();
            //3.将此实现类的对象作为参数放到Thread类的构造器当中
            Thread t1 = new Thread(mythread);
            //4.调用start方法
            //4.1开始当前的线程
            //4.2调用当前线程的run
            //4.3Thread的构造方法的参数类型是runnable类型			的 正好在Thread当中声明的了一个
            //runnable类型的target变量,
            // 这时传入的实现了runnable接口的实现类的对象
            //正好使得target不为null 这时 当前的对象t1就调用mythread再调用run()方法
            
            t1.start();
        }
    }
    
    
  • 比较两种创建线程的方式

    • 优先选择Runnable接口的方式
    • 实现的方式没有类的单继承性的局限性
    • 更适合处理多个线程有共享数据的状况。
    • Thread类本身也实现了runnable接口
posted @ 2020-03-23 21:09  无名之辈c  阅读(96)  评论(0编辑  收藏  举报