1.线程 1.什么叫做线程,跟进程之间的关系 进程:独立的cup空间运行 线程:进程中的一个执行流程,一个进程中可以包含多个线程,这些线程共享该进程提供的资源 2.创建线程(两种方式) 让这类继承Thread类
class XXX extends Thread{ public void run() Thread xx = new Thread(); xx.start(); }实现一个Runnable接口
public class ThreadTest3 { public static void main(String[] args) { MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable,"myThread"); thread.start(); System.out.println(Thread.currentThread().getName()); } } class MyRunnable implements Runnable{ @Override public void run() { //myRunnable不是一个线程内,因此this并不是一个线程对象 System.out.println(Thread.currentThread().getName()); } }3.生命周期 新建:构建好一个线程对象的时候 new 线程 () 处于新建状态的线程是不能直接运行的
start()就绪:线程在调用完start方法后会从新建状态转到就绪状态,只能位于就绪状态的线程抢夺CPU执行的权利
运行:位于运行状态的线程才能真正执行 执行完成 或者是我们通过一些方法将这个线程终止了
stop();死亡:处于死亡状态的线程时没有机会重新回到就绪状态再次抢夺CPU 阻塞 1.其他阻塞状态:当我们正在运行的线程调用sleep方法或者是调用join方法时,线程会从运行状态到达阻塞状态 sleep();正在运行的线程释放CPU去睡觉
//sleep方法 public class ThreadTest4 { public static void main(String[] args) throws Exception { Thread main = Thread.currentThread(); System.out.println(main.getName()); Thread t = new MyThread2(); t.start(); main.sleep(1000); /*t.interrupt();*/ System.out.println("主线程执行结束"); } } class MyThread2 extends Thread{ @Override public void run() { for(int i=0;i<10;i++) { System.out.println(i); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }睡醒:不会抛出异常 睡眠状态被打断:会抛出异常,立马从阻塞状态回到就绪状态,准备执行 join();当一个线程调用join方法的时候,join这个代码所在的线程会被挂起到达阻塞状态,等待调用join的线程执行完成,被挂起的线程才能从阻塞状态回到就绪状态
//join方法 public class Thread5Test { public static void main(String[] args) throws Exception { System.out.println(Thread.currentThread().getName()); Thread t = new MyThread3(); t.start(); t.join(); /*t.interrupt();*/ System.out.println("主线程执行结束"); } } class MyThread3 extends Thread{ @Override public void run() { for(int i=0;i<10;i++) { System.out.println(getName()+":"+i); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }2.锁等待池:一个线程抢夺到了CPU但是没有获取到执行某个代码块的锁对象,这时这个线程就从运行状态到锁池,当使用的锁是皇后jvm会从锁池中挑选一个等待这个锁对象的线程从锁池回到就绪状态准备执行 3.wait池:正在持有锁对象的线程在执行过程中主动调用wait方法释放锁对象,那么这个线程就会从运行状态到达wait池,当使用它释放的这个锁对象的线程使用完成并通知wait池中的线程时,这个线程才会从wait到达锁池,再从锁池到达就绪状态 什么叫做死锁? A线程所需的锁被B线程拿着,B线程所需的锁被A线程拿着 双方谁也不让谁就死锁