1.进程和线程的概念
进程:是程序一次动态的执行过程,它经历了代码加载,执行,执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程。
线程:是比进程更小的执行单位,线程是进程内部单一的一个顺序控制流。所谓多线程是指一个进程在执行过程中可以产生多个线程,这些线程可以同时存在,同时运行,形成多条执行线索。一个进程可能同时包含了多个同时执行的线程。
2.进程和线程的区别
1)同样作为基本的执行单位,线程是划分的比进程更小的执行单位。
2)每个进程都有一段专用的内存区域,与此相反,线程却共享内存单元(包含代码和数据),通过共享的内存单元来实现数据的交换、实时通信、与必要的同步操作。
3.线程的实现方式
1)继承Thread类
2)实现Runnable接口
实现Runnable接口相对于继承Thread类来说有,有下列优点:
1)适合多个相同程序的代码去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效的分离、较好的体现面向对象设计的思想。
2)可以避免由于JAVA的单继承特性带来的局限。即要将某个已经继承父类放入多线程中时,由于一个类不同时拥有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个执行线程的代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传进去,这个接口就实现了Runnble接口的类例。
4.线程的状态
新建:Thread thread = new Thread();
就绪:调用start()方法后,就处于就绪状态。
运行:当就绪的线程获得处理器资源时,就处于运行状态。此时自动调用该线程对象的run()方法。
堵塞:一个正在执行的线程在某种特殊情况下,如被人为挂起或需要执行耗时的输入输出操作时,将让出CPU并暂时中止自己的执行,进入堵塞状态。如果调用sleep()、suspend()、wait()方法时,线程将进入堵塞状态。
死亡:线程调用stop()方法或者run()方法结束后。就进入死亡状态。处于死亡的线程不具有继续运行的能力。
5.线程操作的一些方法
声明一个线程对象:
public ThreadDemo extents Runnable{}
ThreadDemo t = new ThreadDemo();
获取进程名字String name = t.getName();
设置进程名字t.setName();
判断进程是否是活动状态t.isLive();
设置后台进程t.setDaemon(true);
设置进程强制制行t.join();
设置进程休眠Thread.sleep(60000);
中断进程t.interrupt();
6.多线程的同步
同步代码块:
synchnorized(对象)
{
需要同步的代码;
}
同步方法:
public synchnorized void method(参数)
{
代码;
}
7.线程间的通讯
通过代码控制,用wait()方法告诉当前线程放弃监视器进入睡眠状态,直到其它线程进入同一监视器并调用notify()为止。
notify()唤醒同一对象监视器中调用wait()的第一个线程。
notifyAll()唤醒同一对象监视器中调用wait()的所有线程,具有最高优先级的线程首先被唤醒执行。
8.线程生命周期的控制
通过控制run()方法中循环条件的方式来结束一个线程的方法是推荐使用的,这也是实际中用的最多的方法。