线程
实现多线程的两种方法
继承Thread类,重新run方法
Thread a=new MyThread(“子线程”);
thread.start();
实现Runnable接口,实现run方法。
MyRunnable my=new MyRunable(); 在这个MyRunnable类中已经重写了run方法
Thread thread =new Thread(myRunnable,"子线程2");
Thread thread =new Thread(myRunnable,"子线程3");
thread.start();
线程的生命周期
------指线程从创建到启动,直至运行结束
------可以通过调用Thread类的相关方法影响线程的运行状态
线程的运行状态
-----新建(new)
----可执行(runnable)
其他线程调用了处于新建状态线程的start方法,该线程对象将装换到‘可执行状态';
-----运行(runnxing)
1处于‘可执行状态’的线程对象一旦获得了CPU控制权,就会装换到‘执行状态’
2在‘执行状态’下,线程状态占用CPU时间片段,执行run方法的代码
3处于'执行状态'下的线程可以调用yield方法,该方法用于自动出让CPU控制权。
线程对象出让控制权后回到‘可执行状态’,重新等待调度。
两者区别
1.runnable接口必须实现run方法,而Thread类中的run方法是一个空方法,可以不重写。
2、runnable接口的实现类并不是真正的线程类,只是线程运行的目标类。要想以线程的方法方式执行run方法,必须依靠
Thread类
3、runnable接口适合于资源的共享
-----阻塞(blocking)
----死亡(Dead)
阻塞状态(Blocking)
---线程在‘执行状态’下由于受某种条件的影响被迫出让CPU控制权,进入阻塞状太
进入阻塞状态的三种情况
--调用sleep方法
--调用jion方法
处于“执行状态”的线程如果调用了其他线程的jion方法,将被挂起进入“阻塞状态”
等目标状态执行完后才会解除阻塞,回到“可执行状态”
--执行I/O操作
线程同步:
1.解决线程并发安全问题。
2.用synchronized来解决线程同步
3.synchronized可以修饰方法和代码块
3.1 修饰的方法,称为同步方法
3.2修饰的代码块,称为同步块
3.3如何在一个线程类中有多个方法,那么只会锁在synchronize修饰的方法,其他方法则可以正常访问。
只能一个个访问,等一个线程完成后另一个在等待状态。
wait()方法:
中断方法的执行,使本线程等待,暂时让出cpu的使用权
notify()方法:
唤醒由于使用这个同步方法而处于等待线程的某一个结束等待
notifyall()方法:
唤醒所有由于使用这个同步方法而处于等待的线程结束等待