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()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具备继续运行的能力

posted @ 2020-04-25 11:08  小阿Q的博客  阅读(148)  评论(0编辑  收藏  举报