补充上一节的,实现多线程程序的两种方式:
(1)从Thread类继承;上一整节都是用这种方式
(2)实现Runnable接口。
- 设置一个线程的优先级public final void setPriority (int priority)
public static final int MAX_PRIORITY Constant Value: 10 (0x0000000a)
public static final int MIN_PRIORITY Constant Value: 1 (0x00000001)
public static final int NORM_PRIORITY Constant Value: 5 (0x00000005) - 例如
说明了当某个线程优先级比较高那么它一直有运行的机会
class MultiThread
{
public static void main(String[] args)
{
MyThread myThread = new MyThread();
//设置为后台线程
//myThread.setDaemon(true);
myThread.setPriority(Thread.MAX_PRIORITY);
myThread.start();
int index = 1;
while(true)
{
if(index++ == 1000)
break;
//获取当前的线程并且获取它的名字
System.out.println("main方法所在的线程的名字:" + Thread.currentThread().getName());
}
}
}
class MyThread extends Thread
{
//run方法是线程的入口函数
public void run()
{
while(true)
{
System.out.println(getName());
//yield();
}
}
}
- Java对多线程的支持:
(a)在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优先级的线程变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得运行的机会。 但是一个长时间处于等待的线程那么它也有可能被线程调度器选择去运行,所以我们不要过分依赖于高优先级将始终运行的特点。
(b)Java线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换。
(c)Java运行时系统所在的操作系统(例如:Windows2000)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。 - 实现Runnable接口来实现线程。请参考下一节