zoukankan      html  css  js  c++  java
  • 创建线程的几种方式

    线程和进程的区别:

      进程:做一个简单的解释,你的硬盘上有一个简单的程序,这个程序叫QQ.exe,这是一个程序,这个程序是静态的概念,它被仍在硬盘上也没人理它,但是当你双击它,弹出一个界面输入账号密码登录进去了,OK,这个时候叫做一个进程。进程相对于程序来说它是一个动态的概念。

      线程:一个进程中最小的执行单元就叫一个线程,简单来讲就是一个程序里不同的执行路径叫做一个线程。

    创建线程的几种方式:

    import java.util.Scanner;
    import java.util.concurrent.*;
    
    /**
     * @ClassName Test
     * @Description TODO
     * @Author liuyi
     * @Date 2020/5/16 12:21
     * @Version 1.0
     */
    public class Test {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            //启动线程的5种方式
            //1,new一个继承了Thread的类
            new MyThread().start();
            //2,实现Runnable接口,匿名内部类的方式,并采用了静态代理的方式
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("通过实现Runnable接口创建线程");
                }
            }).start();
            //3,lambda表达式创建,其实只是将第二种方式换了个写法
            //这里为什么可以用lambda表达式,是因为Runnable是一个函数式接口
            //函数式接口就是用有且只有一个方法的接口(通常用@FunctionalInterface注解),所以可以将方法名称省略
            new Thread(()-> System.out.println("通过lambda表达式创建线程")).start();
            //4,使用FutureTask+Callable创建(当需要获取线程返回值的时候需要通过这种方式进行创建)
            FutureTask futureTask =  new FutureTask(new MyTask());
            new Thread(futureTask).start();
            //futureTask.get()方法会一直阻碍,直到获取到结果,程序才会继续执行
            System.out.println(futureTask.get());
            //5,通过线程池的方式创建
            ExecutorService service = Executors.newCachedThreadPool();
            service.execute(()-> System.out.println("通过线程池的方式创建线程"));
            service.shutdown();
        }
    }
    class MyThread extends Thread{
        public void run(){
            System.out.println("通过继承Thread类并重写run方法创建线程");
        }
    }
    
    class MyTask implements Callable {
        public  MyTask() {
        }
        //构造函数,用来向task中传递任务的参数
        //任务执行的动作
        @Override
        public String call() throws Exception {
            System.out.println("通过FutureTask+Callable创建线程");
            Thread.sleep(1000);
            return "我是此次线程的返回值";
        }
    }  
  • 相关阅读:
    使用线程的场景
    进程和线程的区别
    线程基础
    Python程序中的进程操作-进程池(multiprocess.Pool)
    Python程序中的进程操作-进程间数据共享(multiprocess.Manager)
    Python程序中的进程操作-进程间通信(multiprocess.Queue)
    Python程序中的进程操作-进程同步(multiprocess.Lock)
    Python程序中的进程操作-开启多进程(multiprocess.process)
    关于<a>标签的onclick与href的执行顺序
    SQLServer2008不允许保存更改
  • 原文地址:https://www.cnblogs.com/liu-yi/p/12942153.html
Copyright © 2011-2022 走看看