多线程是Java语言的一大特性多线程就是同时存在N个执行体按几条不同的执行线索共同工作的情况程序进程线程可以从不同的角度去理解程序就是一段静态的代码可以理解成一组计算机命令的集合进行就是这个程序一次动态的执行过程从代码的加载到执行完毕的一个过程线程是一个比进程小的单位一个进程再执行的过程中可以产生多个线程每个线程也是由生产到销毁可以理解成是进行的子集我个人用一个觉得还算恰当的比喻来比喻三者QQ客户端就是一个程序登陆一个QQ就是开始了这个程序的一个进程再QQ上发送消息给好友就貌似这个进程中的一个线程不知道这样比喻恰当否?
线程也是有状态和声明周期的每个Java程序都会有一个缺省的主线程对于应用程序applcation来说main方法就是一个主线程Java语言使用的是Thread类及其子类的对象来表示线程的创建一个新的线程的生命周期如下状态:
) 新建:当一个Thread类或者其子类的对象被声明并创建时新的线程对象处于新建状态此时它已经有了相应的内存空间和其他资源
) 就绪:处于新建状态的线程被启动后将进入线程队列排队等待CUP服务这个时候具备了运行的条件一旦轮到CPU的时候就可以脱离创建它的主线程独立开始自己的生命周期
) 运行:就绪的线程被调度并获得CUP的处理边进入了运行状态每一个Thread类及其子类的对象都有一个重要的run()方法当线程对象被调度执行的时候它将自动调用本对象的run()方法从第一句代码开始执行所以说对线程的操作应该写到run()方法中
) 阻塞:一个正在执行的线程如果再某种情况下不能执行了进入阻塞状态这个时候它不能进入排队状态只有引起了阻塞的原因消失的时候线程才可以继续进入排队状态等待CUP处理
) 死亡:处于死亡状态的线程不具有继续执行的能力线程死亡主要的原因是正常运行的线程完成了全部工作即执行完了run()方法另外就是被提前强制的终止了
线程的调度也是有优先级别的就是说同样的排列优先级高可以提前被CPU处理主要分三个级别高中低分别代表的数字是分别有三个常量代表不可以被改变最小优先级的常量是MIN_PRIORITY普通的优先级的常量是NORM_PRIORITY最高的优先级的常量是MAX_PRIORITY一般主线程的优先级是普通另外可以通过Thread类的setPriority(int a)方法来修改系统自动设置的线程优先级
Java中编程实现多线程应有两种途径一种是创建自己的线程子类另外是实现一个接口Runnable无论是那种途径最终读需要使用Thread类及其方法Thread类有两种构造方法public Thread()用来创建一个线程对象public Thread(Runnable r)创建线程对象参数r成为被创建的目标对象这个目标必须实现Runnbale接口给出该接口的run()方法的方法体再方法体中操作用两个构造方法创建完的线程就是一个新建的状态等待处理然后启动线程的start()方法启动线程对象线程进入排队状态也就是就绪状态然后线程操作run()方法这个方法里的内容是被系统处理的内容如果想使线程进入休眠状态可以调用sleep()方法可以给一个参数代表休眠的毫秒如果给两个参数代表那秒终止线程用yield()方法来完成判断线程是否销毁可以用idAlive()方法判断线程是否活着Runnable接口只有一个方法run()方法我们实现这个接口把要操作的代码写到这个方法中然后再把实现了整个接口的类的实例传给Therad类的构造方法即可操作线程
线程同步是一个再处理线程的时候需要注意的问题同步方法要用synchronized关键字类修饰被这个关键字修饰后当一个线程A使用这个方法后其它线程想使用这个方法就必须等待知道线程A使用完该方法后方可使用下面我写一个例子来说明线程同步这个例子有两个线程会计和出纳他们共同有一个账本他们俩都可以存取方法对账本进行访问会计使用存取方法的时候写入存钱的记录出纳则写入取钱的记录因此会计使用账本的时候出纳被禁止使用反之也是如此就是一个人使用另外一个人必须等待下面我通过一个小程序Applet来实现这个事:
import Javaapplet*;
import Javaawt*;
import Javaawtevent*;
public class MyThread extends Applet implements Runnable
{
int money = ;
TextArea text = null;
TextArea text = null;
Thread Kuaiji = null;
Thread Chuna = null;
public void init()
{
Kuaiji = new Thread(this);
Chuna = new Thread(this);
text = new TextArea();
text = new TextArea();
add(text);
add(text);
}
public void start()
{
Kuaijistart();
Chunastart();
}
public synchronized void Cunqu(int number)
{
if(ThreadcurrentThread() == Kuaiji)
{
for(int i=;i<=;i++)
{
money = money + number;
try {Threadsleep();}
catch(Exception e){}
textappend(\n+money);
}
}
else if(ThreadcurrentThread() == Chuna)
{
for(int i=;i<=;i++)
{
money = money number/;
try {Threadsleep();}
catch(Exception e){}
textappend(\n+money);
}
}
}
public void run()
{
if(ThreadcurrentThread()==Kuaiji || ThreadcurrentThread()==Chuna)
{
for(int i=;i<=;i++)
{
Cunqu();
}
}
}
}
当一个线程使用同步方法中的某个变量而此变量又需要其他线程修改后才能符合本线程的需要那么可以再同步方法中使用wait()方法使本线程等待并允许其他线程使用这个同步方法用notfyAll()方法同志所有的由于使用这个同步方法的处于等待的线程结束等待进入同步方法中运行如果使使用notfy()就是单独同志一个线程进行同步方法进行活动简单的理解就是wait()方法让线程等待notfy()当一个线程运行notfyAll()让全部线程运行虽然Java支持多线程一般线程不需要我们自己处理但是也是需要了解和掌握的再日后的项目中获取会根据不同情况有不同的需求