java是少数的几种支持"多线程"的语言之一。大多数的程序语言智能循环运行单独一个程序块,但无法同时运行不同的多个程序块。java的"多线程"恰好可以弥补这个缺憾,它可以让不同的程序块一起运行,如此一来可让程序运行更为顺畅。
首先,我们来了解一下进程和线程的区别:
进程:
1.在操作系统中进程是进行系统资源分配、调度和管理的最小单位,进程在执行过程中拥有独的内存单元。
2.每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1~n个线程。
线程:
1.操作系统是以进程为单位,而进程是以线程为单位的,进程中必须有一个主线程main。
2.同意一线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
多线程:是指在同一程序中有多个顺序流在执行。
多进程:是指操作系统能同时运行多个任务(程序)。
第二、实现多线程的方法:继承Thread类、实现Runnable接口。
实现Runnable接口:可以实现接口,也可以匿名实现接口
1.定义一个类,实现Runnable接口,实现接口的run()方法,run()方法内部定义多线程要运行的代码。
2.创建一个Runnable接口实现类的对象。
3.创建一个Thread类的对象,用刚才Runnable接口实现类对象作为构造函数参数。
4.调用Thread对象的start()方法来启动线程。
class 类名称implements Runnable // 实现Runnable接口
{
属性
方法…
修饰符run(){
// 复写Thread类里的run()方法 以及线程处理的程序;
}
}
多线程的启动方式:new Thread(Runnable实现类对象).start();
继承Thread类:
1.定义一个类使之继承Thread类。
2.复写Thread类的public void run()方法,需要多线程处理的代码必须写在run()方法内部。
多线程的定义语法:
修饰符 class 类名称extends Thread // 从Thread类扩展出子类
{
属性
方法…
public void run(){ // 覆写Thread类里的run()方法
线程处理的程序;
}
}
启动多线线程的方式: new 线程类名().start();
注意:
启动多线程必须是通过线程类的对象来调用start()方法。
不能直接调用run()方法,如果直接调用run()则仍然是单线程,没有启动多线程。
通过调用start()方法,启动一个子线程,子线程会直接运行run()方法内的代码。
两种机制的比较:
1.继承Thread:
缺点:不能再从其他类继承。
优点:编写和操作简单可以直接操纵线程。
2.实现Runnable:
优点:
适合多个相同的程序代码去处理同一个资源。
可以避免java的单继承的限制。
增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
*线程Thread类的一些方法
public void start();//开始执行线程public staticThread currentThread() //返回当前正在执行的线程对象的引用public ClassLoader getContextClassLoader() //返回该线程的上下文ClassLoaderpublic final boolean isAlive() //测试线程是否处于活动状态public Thread State getState() //返回该线程的状态public final String getName() //返回该线程的名字public final void setName(String name) //改变线程的名字public final void setDaemon(boolean on) //将该线程标记为守护线程或用户线程
b.就绪(WAITING):