根据Thread.State类中的描述,Java中线程有六种状态:NEW,RUNNABLE,WAITING,TERMINATED,BLOCKED。ide
就绪状态(NEW):当线程对象调用了start()方法以后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。this
运行状态(RUNNABLE):若是就绪状态的线程获取 CPU 资源,就能够执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它能够变为阻塞状态、就绪状态和死亡状态。spa
阻塞状态:若是一个线程执行了sleep(睡眠)、wait(等待)等方法,失去所占用资源以后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或得到设备资源后能够从新进入就绪状态。能够分为三种:操作系统
死亡状态(TERMINATED):一个运行状态的线程完成任务或者其余终止条件发生时,该线程就切换到终止状态。线程
值得注意的是,以上状态为JVM线程状态,不反应操做系统线程状态。code
线程状态迁移图orm
每个 Java 线程都有一个优先级,这样有助于操做系统肯定线程的调度顺序。线程优先级是一个正整数,全部建立的线程默认优先级为5(Thread.NORM_PRIORITY),可设置最大优先级为10(Thread.MAX_PRIORITY),最小优先级为1(Thread.MIN_PRIORITY)。在全部获得其余资源并等待处理器资源的线程中,优先级高的线程理论上将被更有可能被优先调度。对象
守护线程意味着不重要的线程(骑士对于公主来讲,是守护者,是无关紧要的备胎),于是当某进程只有守护线程在执行时,该进程会当即结束运行。 blog
1.新建类继承Thread类。继承
2.重写run()方法。该run()方法的方法体就表明了线程须要完成的任务。
3.建立Thread子类的实例。
4.调用线程对象的start()方法来启动该线程。
public class myThread { public static void main(String[] args){ Thread t = new newThread(); t.start(); } } class newThread extends Thread{ @Override public void run() { System.out.println(this.getName()+":start!"); } }
1.新建类实现Runnable接口。
2.重写run方法。该run()方法的方法体就表明了线程须要完成的任务。
3.建立新建类的实例target。
4.以target做为参数建立Thread的实例。
5.调用线程对象的start()方法来启动该线程。
public class myThread { public static void main(String[] args){ newThread nt = new newThread(); Thread t = new Thread(nt); t.start(); } } class newThread implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+":start!"); } }
1.继承Thread这种方法方便易用,更容易获取当前线程对象。
2.实现Runnable接口这种方法能够继承其余父类;多个线程能够共享一个target对象,适合多个相同线程来处理同一份资源的状况。
事实上,线程对象只有调用start()方法才能在新的线程中运行run()方法体中的代码,而直接调用run()方法意味着在当前线程中调用run()方法,即run()方法被看成普通方法处理了,并不会建立新线程。
public class myThread { public static void main(String[] args){ newThread nt = new newThread(); Thread t = new Thread(nt,"myThread"); t.run(); } } class newThread implements Runnable{ @Override public void run() { System.out.println("Name:"+Thread.currentThread().getName()); } } //结果 Name:main
Thread() ,Thread(String name) //能够传入一个字符串或什么也不传入,就是建立一个什么任务也不作的线程
Thread(Runnable target)
Thread(Runnable target,String name) //传入一个可运行的对象,name做为线程名称
static Thread currentThread() //获取当前线程对象
long getID() //获取线程标识
String getName() //获取线程名称
int getPriority() //获取线程优先级
Thread.state getState() //获取线程状态
public class myThread { public static void main(String[] args){ newThread nt = new newThread(); Thread t = new Thread(nt,"myThread"); t.start(); newThread.getInformation(Thread.currentThread()); newThread.getInformation(t); } } class newThread implements Runnable{ @Override public void run() { } static void getInformation(Thread t){ System.out.println("name:"+t.getName()); System.out.println("id:"+t.getId()); System.out.println("priority:"+t.getPriority()); System.out.println("state:"+t.getState()); } } //结果 name:main id:1 priority:5 state:RUNNABLE name:myThread id:13 priority:5 state:TERMINATED
void setName() //设置线程名称
void setPriority() //设置线程优先级
void setDaemon(Boolean on) //设置为守护线程,只有当线程调用start()方法以前才可调用
boolean isAlive() //判断线程是否死亡,
boolean isDaemon() //判断线程是否为守护线程
boolean isInterrupted() //判断线程是否中断,而且将其变为非中断状态
public class myThread { public static void main(String[] args){ newThread nt = new newThread(); Thread t = new Thread(nt,"myThread"); System.out.println("未调用start()时:"+t.isAlive()); t.setDaemon(true); t.start(); newThread.getInformation(t); newThread.getInformation(Thread.currentThread()); } } class newThread implements Runnable{ @Override public void run() { } static void getInformation(Thread t){ System.out.println(t.getName()+"-isAlive:"+t.isAlive()); System.out.println(t.getName()+"-isDaemon:"+t.isDaemon()); System.out.println(t.getName()+"-isInterrupted:"+t.isInterrupted()); } } //结果 未调用start()时:false myThread-isAlive:true myThread-isDaemon:true myThread-isInterrupted:false main-isAlive:true main-isDaemon:false main-isInterrupted:false
该方法让当前线程暂停执行一段时间。
static void sleep(long millis) //暂停millis毫秒
static void sleep(long millis,long nanos) //暂停millis毫秒+nanos纳秒
join意味加入,能够抽象地认为它是加入当前线程队伍,也就是说,发生t.join()调用时调用方t加入当前线程队伍,当前线程须要等待t线程执行完毕后才开始执行。
public class myThread { public static void main(String[] args)throws InterruptedException { newThread nt = new newThread(); Thread t = new Thread(nt,"subThread"); t.start(); t.join(); for (int i = 1; i <= 1000; i++) { if (i%500==0) { System.out.println("mainThread finish!"); } } } } class newThread implements Runnable{ @Override public void run(){ for (int i = 1; i <= 1000; i++) { try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } if (i%500==0) System.out.println("subThread finish!"); } } }
结果以下,主线程显然是比子线程执行时间更短,然而仍是主线程最后执行完
subThread finish! subThread finish! mainThread finish! mainThread finish!
方法还有另外两个重载形式
void join(long millis) //等待millis毫秒
void join(long millis,long nanos) //等待millis毫秒+nanos纳秒
join()内部使用wait()方法和notifyall()方法来实现的,于是它与sleep()方法的区别是,sleep方法不会释放持有的锁,而join()方法会释放持有的锁。
//将t.join()改成t.join(50,50)后,结果不一样: mainThread finish! mainThread finish! subThread finish! subThread finish!
让出当前线程cup的使用权,此时就绪队列中高优先级 的线程将被执行,此外该方法不释放线程持有的锁。