线程编程有两种方法,一种是继承Thread类并覆盖run()方法,一种是实现Runable接口。
举例:
class MyThread extends Thread{
public void run(){//覆盖代码}
}
使用自己创建的线程类时:
Thread t = new MyThread();
t.start();//线程启动,向线程调度器说明当前线程已经准备好开始运行。
class MyThread implements Runnable{
public void run(){//填写线程启动后要做的事情}
}
启动线程:
Runnable r = new MyThread();
Thread t = new Thread(r);
t.start();
Thread中的一些方法:
currentThread()返回当前正在执行的线程对象的引用
sleep(long millis)制定毫秒数内让当前正在执行的线程休眠,线程休眠之后其他线程回去竞争执行权限,本线程在休眠完成之前不会参与竞争
yield()暂停当前正在执行的线程对象,并执行其他线程,只给优先级大于本类或本类的线程去抢
join()等待该线程终止
setDaemon(boolean on)将该线程标记为守护线程,守护线程需要依赖其他线程,在虚拟机停止的时候停止
sleep()与wait()的区别:wait是Object类的方法,而sleep是线程类的方法;sleep不会释放锁,而wait会;别的线程执行了notify方法才会唤醒wait的线程,而sleep是超过了毫秒数自己就会唤醒。
线程有7个状态,称为线程的声明周期
1)初始状态:new了一个Thread但并没有执行start()时
2)可运行状态:调用了start()但是并没有占用上CPU
3)运行状态:占用CPU
4)阻塞状态:sleep() join()或等待输入时
5)等待状态:一个线程调用了一个Object的wait()函数会释放对该对象的锁,进入等待状态,只有另外一个线程调用该Object的notify方法时才会重新竞争
6)锁池状态:一个线程想运行必须获得某一Object的锁,但是该Object现在被其他Thread锁住了,所以在锁池中等待
7)终止状态:运行结束,一个进程的所有线程都运行结束后才会处于终止状态
Thread类
Java系统内置Thread类,其功能是将CPU分割成多个时间片段,根据线程的状态,适当地提供给条件最优的线程并让其运行。
方法isAlive() join()
由类Thread产生的新对象,其运行时机是伴随CPU而具有机动性的,所以与其相关的方法也都与此有关。常用的方法有start() run() stop() suspend() setName() getName() wait() notify() join() isAlive() setPriority() getPriority() yield()
isAlive()的功能为测知某线程是否仍存在;join()用于添加运行线程,等待调用此方法的线程结束后,让其他线程继续运行。
使用*.isAlive()可测知某线程是否仍存在,使用*.join()测知调用此方法的线程是否结束,同时允许其他线程添加继续运行。
例:
JOB job1 = new JOB("job1");
JOB job2 = new JOB("job2");
job1.start();
job2.start();
if(!job1.isAlive()){
try{
job1.join();
}catch(InterruptedException e){}
}
方法suspend() resume()
线程一直是处在争抢CPU的紧张环境中,但也可以使用方法suspend()让其暂时退出此紧张环境,而进入等待状态,再视需要使用resume()让其伺机重新进入就绪状态。
例:
JOB job1 = new JOB("job1");
JOB job2 = new JOB("job2");
job1.start();
job2.start();
job2.suspend();
try{job1.join();}catch(InterruptException e){}
job2.resume();
}
方法setPriority() getPriority()
在众多线程中,必然会有某些线程因需要而必须优先运行,此时可以使用setPriority()来设置线程的优先级,也可以使用getPriority()来读取某线程的优先级。
注:线程优先级为1-10,数字越大优先级越高,也就是越能优先运行。
例:
JOB job1 = new JOB("job1");
JOB job2 = new JOB("job2");
job1.setPriority(1);
job2.setPriority(Thread.MAX_PRIORITY);
job1.start();
job2.start();
synchronized的应用
为了避免遇到混乱的状态,可以用sychronized的功能,让所有线程井然有序的进入CPU中运行,在不混乱的状况下,迅速执行众多线程的同步工作。
例:
public synchronized int getNumber(){...}这个方法只能有一个线程调用,一旦有线程调用此方法,即锁住该方法,其他线程不能再调用,直到占用的线程释放该方法。
线程组Thread Group的应用
方便管理可以将多个线程分成线程组,内置类ThreadGroup
例:
创建线程组:ThreadGroup grp = new ThreadGroup();
构建Thread类的子类:class JOB extends Thread{}
在子类的构造函数里面写:
JOB(ThreadGroup grp, String threadName,...){
super(grp, threadName);
}
可以用grp.stop()来同时结束