Day19个人总结

一、进程和线程

1、概念:

进程包括多个线程,一个进程可以有多个线程,每个独立运行着的程序称为一个进程,进程中最少有一个线程,简单的说进程就是操作系统的一个软件,线程就是进程中的一条执行路径

2、多线程的好处:

1)多线程提高执行效率

2)可以提高资源利用率

从宏观意义上讲多线程同一时刻执行多个线程,微观意义上来说cpu同一时刻只执行一个线程

Cpu时间片段

3、主线程和子线程

主线程:是指系统提供的线程,又叫main线程,由jvm虚拟机提供

子线程:需要程序员自己创建,又叫工作线程

二、Thread类和Runnable接口

1、作用:

用于自己创建的线程又叫子线程,需要继承Thread类和接口Runnable方能创建线程,创建的子线程默认情况下是随机和主线程抢占cpu资源进行执行,子线程和主线程两者是竞争关系,每个字线程都是独立开辟栈空间,并且是由主线程执行到.strat()来进行栈空间的开辟

2、Thread类方法的使用

类在集成Thread方法之后setName()和getName()方法不能重写,在原有子类就存在,可以通过super方法调用改变线程的名字,各方法如下:

1)  start()方法用于启动线程,并且创建新的线程在栈空间中开辟新的空间

2)  run()调用线程对象中的run方法 不会产生新的线程,是在主线程中执行的

3)  join()表示插队合并插队到当前线程前

4)  sleep()当前线程睡眠进入到阻塞状态,释放cpu资源,其他的线程均可抢占cpu资源

5)setPriority()设置线程优先级优先级高的尽可能多去抢占cpu资源(可能不准)设置范围为1-10之间,越高表示优先级越高

3、Thread和Runnable的使用资源的共享(关键代码)

publicclass TestContainer {

    publicstaticvoid main(String[] args) {

       //创建Container类

       Container container = new Container();

       //创建三个线程操作Container

       Thread thread =new Thread(container,"线程1:");

       Thread thread2 =new Thread(container,"线程2:");

       Thread thread3 =new Thread(container,"线程3:");

       //启动各个线程

       thread.start();

       thread2.start();

       thread3.start();

    }

}

publicclass Container implements Runnable{

    privateint count=200;

    @Override

    publicvoid run() {

       for(int i=0;i<10;i++){

           System.out.println("我是"+Thread.currentThread().getName()+"count还剩下"+this.getOne());

           //this.getOne();

           try {

              Thread.sleep(100);

           } catch (InterruptedException e){

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

    publicint getOne(){

       this.count--;

       returnthis.count;

    }

}

三、经典面试题

1、start和run的区别

1)start() 会创建新的栈空间并且会产生新的子线程(工作线程)

2)run()调用线程对象中的run方法且不会产生新的线程,是在主线程中执行的

四、终止线程

1、线程终止:

1)  标志位停止线程

2)  .stop()方法终止线程(已过时)使用时可能不能执行完想要执行的程序

3)  Interrupt()方法中断线程,会抛出异常

2、使用如下:(关键代码)

例1

publicclass Test5

    publicstaticvoid main(String[] args) {

       // 标志位  停止线程

       C c = new C();

start();

       // 加Scanner 完全是为了模拟 等待的过程

Scanner scanner = new Scanner(System.in);

       scanner.nextLine();// 等待用户输入

       // 改变标志位停止线程

       //c.flag = false;

       // 2 stop方法停止线程

stop();// 不推荐使用,有可能 不能执行完想要执行的内容

    }

}

class C extends Thread{

    boolean flag = true;

Override

    publicvoid run() {

       while(flag){

System.out.println("要睡了");

           try {

Thread.sleep(2000);

           } catch (InterruptedException

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

System.out.println("睡醒了");

       }

    }

 

2

publicclass Test6

    publicstaticvoid main(String[] args) {

       D d = new D();

start();

Scanner scanner = new Scanner(System.in);

       scanner.next();

        // 通过抛异常的方式 打断线程的执行

interrupt();

    }

}

class D extends Thread{

Override

    publicvoid run() {

      

System.out.println("要睡了");

       try {

Thread.sleep(5000);

       } catch (InterruptedException

System.out.println("被打醒的");

       }

System.out.println("自然醒");

      

    }

}

3、线程的五种状态(又叫生命周期,不是非常准确)

图解:

 

java子线程获取主线程数据 java主线程和子线程_学习java总结