多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。
进程:执行程序一次的执行过程,动态的,由系统资源分配的单位。
线程:是cpu调度和执行的单位。
进程包括多个线程,至少有一个线程。
真正的多线程是有多个cpu,即多核。
模拟出来的多线程是一个cpu,在一个时间点只能执行一个代码,因为切换的很快,所以就有了同时执行的错觉。
/**
 * 多线程 第一种 通过Thread实现
 */
public class ThreadDemo01 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我在看代码--"+i);
        }
    }
    public static void main(String[] args) {
        ThreadDemo01 t1 = new ThreadDemo01();
//        普通的调用方法启动,按照顺序执行
//        t1.run();
        t1.start();    //正确的线程启动,不一定立即启动,等待cpu调度
        for (int i = 0; i < 100; i++) {
            System.out.println("我在学习--"+i);
        }
    }
}
public class RunnableDemo01 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我是子线程--"+i);
        }
    }
    public static void main(String[] args) {
        RunnableDemo01 runnable = new RunnableDemo01();
        Thread thread = new Thread(runnable);
        thread.start();
        for (int i = 0; i < 100; i++) {
            System.out.println("我是主线程--"+i);
        }
    }
}
/**
 * 通过Callable 实现多线程
 * 主要环节在四个注释的地方
 */
public class CallableDemo01 implements Callable<Boolean> {
    private String name;
    public CallableDemo01(String name) {
        this.name = name;
    }
    @Override
    public Boolean call() throws Exception {
        for (int i = 0; i < 100; i++) {
            System.out.println("我在看"+name+"--"+i);
        }
        return true;
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CallableDemo01 t1 = new CallableDemo01("淘宝");
        CallableDemo01 t2 = new CallableDemo01("京东");
        CallableDemo01 t3 = new CallableDemo01("苏宁易购");
        //创建执行服务
        ExecutorService ser = Executors.newFixedThreadPool(3);
        //提交执行
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3);
//        获取结果
        Boolean res1 = r1.get();
        Boolean res2 = r2.get();
        Boolean res3 = r3.get();
        //关闭服务
        ser.shutdownNow();
        for (int i = 0; i < 100; i++) {
            System.out.println("我正在看着你们--"+i);
        }
    }
}
把一个任务交给多个线程来运行,就好比田径场分成1,2,3...等跑道,具有通用性。
原文:https://www.cnblogs.com/gbhh/p/13768069.html