一个线程可以有四种状态:
1、新(New):线程对象已经创建,但尚未启动,所以不可运行。
2、可运行(Runnable):意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行。因此,线程可能在、也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行——它既没有“死”掉,也未被“堵塞”。
3、 死(Dead):从自己的run()方法中返回后,一个线程便已“死”掉。亦可调用stop()令其死掉,但会产生一个违例——属于Error的一个子类(也就是说,我们通常不捕获它)。记住一个违例的“掷”出应当是一个特殊事件,而不是正常程序运行的一部分。所以不建议你使用stop()(在Java 1.2则是坚决反对)。另外还有一个destroy()方法(它永远不会实现),应该尽可能地避免调用它,因为它非常武断,根本不会解除对象的锁定。
4、 堵塞(Blocked):线程可以运行,但有某种东西阻碍了它。若线程处于堵塞状态,调度机制可以简单地跳过它,不给它分配任何CPU时间。除非线程再次进入“可运行”状态,否则不会采取任何操作。
编写一个应用程序创建两个线程,一个线程打印输出1~100之间所有的奇数,另外一个线程打印输出1~100之间所有的偶数,要求两个线程随机休眠一段时间后继续打印输出下一个数。分别使用Runnable接口和Tread类编程实现。
package Multithreading;
public class Output {
public static void main(String[] args) {
// TODO 自动生成的方法存根
OddNumber oddnumber = new OddNumber();
EvenNumber evennumber = new EvenNumber();
oddnumber.start();
evennumber.start();
}
}
package Multithreading;
/**
* 创建线程的方法--继承Thread
* 打印输出1~100之间所有的奇数
*/
public class OddNumber extends Thread {
int x;
/* 重写run方法 */
public void run() {
for (x = 1; x <= 100; x++)
{
if (x % 2 != 0)
{
System.out.println("奇数是 " + x);
}
try {
/* 线程睡眠,把控制权交出去 */
sleep((int) (Math.random() * 100) + 100);
} catch (InterruptedException e) {
/* 线程执行结束 */
System.out.println("DONE! " + getName());
}
}
}
}
package Multithreading;
/**
* 创建线程的方法--实现Runnalbe接口
* 打印输出1~100之间所有的偶数
* 注意,因为实现的是接口,在调用方法时必须指明是当前的的线程,即加关键字Thread
*/
public class EvenNumber implements Runnable {
int y;
/* 重写run方法 */
public void run() {
for (y= 1; y <= 100; y++)
{
if (y % 2 == 0)
{
System.out.println("偶数是 " + y);
}
try {
/* 线程睡眠,把控制权交出去 */
Thread.sleep((int) (Math.random() * 200) + 200);
} catch (InterruptedException e) {
/* 线程执行结束 */
System.out.println("DONE! " + Thread.currentThread().getName());
}
}
}
public void start() {
run();
}
}