线程和进程的区别:
进程:做一个简单的解释,你的硬盘上有一个简单的程序,这个程序叫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 "我是此次线程的返回值"; } }