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

  • 相关阅读:
    zookeeper配置
    redis前端启动和后台启动的区别
    SpringMVC接受JSON参数详解及常见错误总结我改
    SpringMVC @RequestBody接收Json对象字符串
    spring MVC 如何接收前台传入的JSON对象数组
    springMVC 接收json字符串参数
    mysql数据库user表host字段的%问题
    mysql.user表中Host为%的含义
    开店攻略: 零售店铺经营的三大原则
    开店攻略: 如何巧妙接近顾客
  • 原文地址:https://www.cnblogs.com/gcm688/p/9542229.html
Copyright © 2011-2022 走看看