?
??1)初始状态????此时线程处于JVM的进程中,只是创建了一个线程对象,并没有开始运行.(new())
??2)就绪状态
????此时线程进入可运行状态,等待CPU调度.(start())
??3)运行状态
????拥有CPU的执行权,并且开始运行线程.(run())
??4)阻塞状态
????线程在等待IO或者调入了sleep()或join()等方法会导致线程进入阻塞状态,从阻塞状态出来的线程不一定马上回到运行状态,而是回到可运行状态等待CPU的再次调度.(blocked)
??5)等待队列状态
????一个线程调用一个对象的wait()方法会放弃该对象的锁并进入等待队列状态,只有当另一线程调用临界资源的notify()或者notifyAll()才会将等待队列中的线程释放,进入锁池状态.(waiting)
??6)锁池状态
????每个对象都有互斥锁标记,如果一个线程想访问一个对象,而该对象的锁标记已被另一线程占用,则该线程进入锁池状态.从锁池状态出来的线程回到可运行状态,等待CPU调度.(locked)
??7)终止状态
????一个线程运行结束后称为终止状态,也叫死亡状态一个进程只有所有的线程退出后才能终止.(dead)
?
??线程操作
????currentThread()???返回对当前正在执行的线程对象
????run()????线程体内执行的代码应该都放在run方法里,用户不应该直接调用run()方法
????start()????使该线程开始执行并调用该线程的run方法
????yield()????暂停当前正在执行的线程对象,并执行其他线程
????sleep()????在指定的毫秒数内让当前正在执行的线程休眠
????join()????等待该线程终止
????interrupt()???中断线程
??线程测试
????isAlive()???测试线程是否处于活动状态
????isInterrupted()???测试线程是否已经中断
????isDaemon()???测试该线程是否为守护线程
??线程属性
????setName()???改变该线程的名称
????getName()???返回该线程的名称
????setPriority()???更改线程的优先级
????getPriority()???返回线程的优先级
????setDaemon()???将该线程标记为守护线程或用户线程
??1)每一个java程序都有一个默认的主线程,即main()函数.
public class ThreadDemo {
public static void main(String[] args) {
Thread thr = new Thread(new MyThread());
thr.start();
int j = 0;
while (j++ < 10) {
System.out.println(Thread.currentThread().getName() + "..." + j);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
class MyThread implements Runnable {
@Override
public void run() {
int i = 0;
while (i++ < 10) {
System.out.println(Thread.currentThread().getName() + "..." + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
?
运行结果:main线程和Thread-0线程不规则交替执行,各自每隔1s输出直到结束.
??2)调用join方法会在当前线程内等待某一线程终止,内部调用了Object的wait()方法.例:
public class ThreadDemo {
public static void main(String[] args) {
Thread thr = new Thread(new MyThread());
thr.start();
try {
thr.join();
} catch (InterruptedException e) {
}
int j = 0;
while (j++ < 100) {
System.out.println(Thread.currentThread().getName() + "..." + j);
}
}
}
class MyThread implements Runnable {
@Override
public void run() {
int i = 0;
while (i++ < 100) {
System.out.println(Thread.currentThread().getName() + "..." + i);
}
}
}
?
运行结果:Thread-0线程全部输出完毕,main线程才继续执行.
??3)调用interrupt()方法可以使得处于阻塞状态的线程抛出一个异常,不会中断正在运行的程序.例:
public class ThreadDemo {
public static void main(String[] args) {
Thread thr = new Thread(new MyThread());
thr.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
thr.interrupt();
}
}
class MyThread implements Runnable {
@Override
public void run() {
int i = 0;
while (i++ < Integer.MAX_VALUE) {
System.out.println(Thread.currentThread().getName() + "..." + i);
}
}
}
?
??运行结果:thr会一直运行.
??但是,调用interrupt()会将中断标志位(isInterrupted())置为true,因此可以通过判断标志位来中断线程:
class MyThread implements Runnable {
@Override
public void run() {
int i = 0;
while (!(Thread.currentThread().isInterrupted()) && i++ < Integer.MAX_VALUE) {
System.out.println(Thread.currentThread().getName() + "..." + i);
}
}
}
?
运行结果:thr运行一段时间后停止.
??一般情况下不建议通过这种方式来中断线程,一般会在MyThread类中增加一个属性isStop来标志是否结束while循环,然后再在while循环中判断isStop的值.
?
??通过setDaemon(true)方法可以设置一个线程为守护线程,守护线程优先级比较低,随着主线程运行完毕自动结束.在JVM中,像垃圾收集器线程就是守护线程.例:
public class Test {
@Override
public void finalize() {
System.out.println(Thread.currentThread().getName() + "收垃圾喽~");
}
public static void main(String[] args) {
new Test();
System.gc();
System.out.println("主线程Over~");
}
}
?
运行结果:
????主线程Over~
????Finalizer收垃圾喽~
原文:http://xiao1zhao2.iteye.com/blog/2230999