Java线程专题 1:线程创建
public class CreateThreadDemo { public static void main(String[] args) { //继承thread接口(这里用匿名内部类),并重写该类的run方法 //调用thread start方法 Thread thread = new Thread() { @Override public void run() { System.out.println("继承Thead"); } }; thread.start(); //实现runnable接口并实现run()方法,但最后还是通过传入Thread对象,调用start方法启动 Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("实现runnable"); } }); thread1.start(); //实现Callable接口并实现call()方法,该call()方法将作为线程执行体,并且有返回值。 //结合线程池,创建Callable实现类的实例,使用FutureTask类来包装Callable对象 ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<String> future = executorService.submit(new Callable<String>() { @Override public String call() throws Exception { return "通过实现Callable接口"; } }); try { String result = future.get(); System.out.println("future result: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } executorService.shutdown(); } }
线程创建三种方式各有优劣,继承Thread类编写简单,当前对象即为当前线程,但限制了类的扩展,不能继承其他类, 而实现Runnable ,Callable类可以避免该情况,并且Callable的任务执行后可通过对象获得返回值。
java虚拟机中的定义了6种状态,在任意时刻,一个线程只能有且只有其中一种状态,状态间可以通过特定方法转换
1、新建New:创建后尚未启动
new Thread()
2、可运行状态Runnable: 包含Running 或 Ready
线程创建后,调用start()方法即处于RUNNABLE状态了。处于RUNNABLE状态的线程可能正在运行,也可能正在等待操作系统分配执行时间
3、阻塞Blocked
如果某一线程正在等待监视器锁,以便进入一个同步的块/方法,那么这个线程的状态就是阻塞Blocked
4、无限期等待Waiting
某一线程因为调用不带超时的Object的wait()方法、不带超时的Thread的join()方法、LockSupport的park()方法,就会处于等待Waiting状态,处于该状态的线程不会被分配执行时间,需要等待其他线程显式唤醒
5、超时等待Timed Waiting
某一线程因为调用带有指定正等待时间的Object的wait()方法、Thread的join()方法、Thread的sleep()方法、LockSupport的parkNanos()方法、LockSupport的parkUntil()方法,就会处于超时等待TIMED_WAITING状态
处于该状态的线程也不会分配执行时间,区别是不用等待其他线程显式唤醒,一定时间后自动唤醒
6、终止状态Terminated
线程调用终止或者run()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具备继续运行的能力