java线程的状态有6种
Thread类内部有枚举类State详细描述了线程的6种状态:
1.初始(NEW):新创建了一个线程对象,但是还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。
3.阻塞(BLOCKED):表线程阻塞于锁。
4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5.超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。
6.终止(TERMINATED):表示该线程已经执行完毕。
实现多线程的四种方法继承java.lang.Thread 类
继承Thread类,重写run方法(Thread类已经实现了runnable接口)
runable中只有run()一个方法。
例子:
public class myThread extends Thread{@Overridepublic void run(){System.out.println("我被调用了");}public stataic void main(String[] args){new myThread().start();}} 实现Runnable 接口比起继承Thread类,类是单继承的,而接口是多继承的,很不方便,所以我们可以自己写一个实现了Runnable接口的类。
在使用时,通过Thread的构造函数来构造Thread对象后使用。
例:
public class myThread implements runnable{@Overridepublic void run(){}public static void main(String[] args){Thread mythread= new Thread(new myThread);mythread.run();}} 实现Callable 接口在继承Thread和实现Runnable时是无法返回值和抛出异常的。
我们利用FutureTask类的构造函数,传入实现了callable接口的对象(实现call()函数,该函数有返回值),
再利用Thread的构造函数,传入实现了Runnable接口的FutureTask对象,最终通过Thread的start()函数来调用
我们通过使用FutureTask类来实现返回值(实现了get函数)
同时实现了Runnable接口,最终传入Thread的构造函数。
例:
(底层还是使用了callable,和runnable)
Executor是顶级接口但不是一个线程池,是工具,
ExecutorService是线程池。
在java底层中唯一实现多线程的方法即被系统调用start()方法
注:一般此方法是一个本地方法(native),会在合适的时候调用run()方法