Thread类:
创建新执行线程有两种方法。
一种方法是将类声明为 Thread
的子类。该子类应重写 Thread
类的 run
方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
} public void run() {
// compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeThread p = new PrimeThread(143);
p.start();
另一种方法是声明实现 Runnable
接口的类。该类然后实现 run
方法。然后可以分配该类的实例,在创建 Thread
时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
注意:Runnable
为非 Thread
子类的类提供了一种激活方式。通过实例化某个 Thread
实例并将自身作为运行目标,就可以运行实现 Runnable
的类而无需创建 Thread
的子类。
即 MyRunnable runnable = new MyRunnable();
Thread t = new Thread(runnable);
Runnable 接口:
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
} public void run() {
// compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
注意线程的开始执行是用其实例对象去调用start()方法,开始执行后才会去调用该线程的run()方法。start()方法如被重写则无法启动线程。并且一个线程对象不可启动多个线程即不能去重复调用start()方法。
一般进行多线程编程时会采用去实现Runnable接口而不是去继承Thead类,因为java是单根继承多实现。可以一次实现多个接口。
并且Runnable可以实现资源共享。
注意:在java平台运行多线程序时要启动任务务管理器,打开设置相关性,只选择一个cpu。
在main方法中创建的线程叫做 main线程(主线程)。主线程运行结束,则整个程序运行结束。
左边为主线程,当主线程运行到虚线处切换运行子线程(右箭头)。在同一cpu运行的多个线程来回切换要运行,提高资源的利用效率。
线程的生命周期:
new线程对象→新建
调用start()就绪状态(Runnable)→方法调用栈、程序计时器→线程处于可运行池中
调用run() 运行状态( Running )占用CPU→特殊情况 堵塞状态(暂时停止运行不占用cpu)
执行结束、异常退出、线程的时间片用完后线程处于死亡状态
堵塞状态的三种情况:
位于对象等待池中的堵塞状态 wait()
执行sleep()
发出IO请求使线程受到阻塞。
堵塞状态只能回到就绪状态,而不能回到运行状态。
刚开始学不对的地方希望指正谢谢。