是程序中执行的一个线程,java虚拟机允许应用程序中多个线程同时执行。
每个线程都有一个优先级,高优先级的线程比低优先级的线程优先执行,每个线程都可能也可能不会被标记为守护进程。当正在运行的代码创建了一个新的Thread对象的时候,这个新的Thread的初始优先级等于创建它的线程的优先级。当创建它的线程是守护线程的时候,那么它也是守护线程。
当java虚拟机启动时,通常有一个非守护线程(main方法),java虚拟机继续执行线程直到以下任何一种情况发生:
1.Runtime类的exit方法被调用,并且是安全的
2.所有的非守护线程都死亡了,从被调用的run方法返回或者fun方法抛出异常
创建一个新的可执行的线程有两种方法,
第一种方法,创建一个类继承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();
第二种方法,创建一个类,实现Runable接口并实现Run方法
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();
每个线程都有一个名称,多个线程名字也可能相同, 如果在创建线程时未指定名称,则会为其生成一个新名称
注意:两种创建线程的方法,启动的时候代码不一样!
看类中的几个方法
yield
public static native void yield();
当前线程愿意让出CPU的提示(给调度器),但是调度器可以忽略这个提示。这个方法很少用,只是在debug或者测试中可能有用,可以复现bug
sleep
public static native void sleep(long millis) throws InterruptedException;
使当前正在执行的线程停留(暂停执行)指定的毫秒数,这取决于系统定时器和调度程序的精度和准确性
yield和sleep都不释放锁,yield是退让(退让只是退让同优先级的,低优先级的还是不能执行),还醒着呢,所以随时可以再次运行,sleep是睡觉,让低优先级的线程有了执行的机会
再看wait方法,它是Object对象的方法,并不是Thread类的方法
public final native void wait(long timeout) throws InterruptedException;
使当前线程等待,直到另一个线程调用notify()或者notifyAll()方法,或者指定的时间已过。notify和notifyAll都是Object类的方法。这个方法会使当前线程把自己放进这个对象的等待集中,并释放这个对象的锁和同步