是程序中执行的一个线程,java虚拟机容许应用程序中多个线程同时执行。java
每一个线程都有一个优先级,高优先级的线程比低优先级的线程优先执行,每一个线程均可能也可能不会被标记为守护进程。当正在运行的代码建立了一个新的Thread对象的时候,这个新的Thread的初始优先级等于建立它的线程的优先级。当建立它的线程是守护线程的时候,那么它也是守护线程。安全
当java虚拟机启动时,一般有一个非守护线程(main方法),java虚拟机继续执行线程直到如下任何一种状况发生:测试
1.Runtime类的exit方法被调用,而且是安全的this
2.全部的非守护线程都死亡了,从被调用的run方法返回或者fun方法抛出异常线程
建立一个新的可执行的线程有两种方法,debug
第一种方法,建立一个类继承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类的方法。这个方法会使当前线程把本身放进这个对象的等待集中,并释放这个对象的锁和同步