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的使用资源的共享(关键代码) public class TestContainer { public static void 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(); } } public class Container implements Runnable{ private int count=200; @Override public void 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(); } } } public int getOne(){ this.count--; return this.count; } } |
三、经典面试题
1、start和run的区别 1)start() 会创建新的栈空间并且会产生新的子线程(工作线程) 2)run()调用线程对象中的run方法且不会产生新的线程,是在主线程中执行的 |
四、终止线程
1、线程终止: 1) 标志位停止线程 2) .stop()方法终止线程(已过时)使用时可能不能执行完想要执行的程序 3) Interrupt()方法中断线程,会抛出异常 2、使用如下:(关键代码) 例1: public class Test5 { public static void main(String[] args) { // 标志位 停止线程 C c = new C(); c.start(); // 加Scanner 完全是为了模拟 等待的过程 Scanner scanner = new Scanner(System.in); scanner.nextLine();// 等待用户输入 // 改变标志位停止线程 //c.flag = false; // 2 stop方法停止线程 c.stop();// 不推荐使用,有可能 不能执行完想要执行的内容 } } class C extends Thread{ boolean flag = true; @Override public void run() { while(flag){ System.out.println("要睡了"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("睡醒了"); } } 例2: public class Test6 { public static void main(String[] args) { D d = new D(); d.start(); Scanner scanner = new Scanner(System.in); scanner.next(); // 通过抛异常的方式 打断线程的执行 d.interrupt(); } } class D extends Thread{ @Override public void run() { System.out.println("要睡了"); try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("被打醒的"); } System.out.println("自然醒"); } } 3、线程的五种状态(又叫生命周期,不是非常准确) 图解: |