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()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具备继续运行的能力
原文:https://www.cnblogs.com/gcm688/p/9542229.html