继承
Thread类,然后复写run()方法,直接new,然后start()
class Th1 extends Thread {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getId());
    }
}
Thread thread1=new Th1();
thread1.start();
实现
Runnable接口,复写run(),new一个Thread(target),target是Runnable,然后start()
class Th2 implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getId());
    }
}
Thread thread1 = new Thread(new Th2());
thread1.start();
实现
Callable接口,复写call()接口,call可以有返回值,然后使用FutureTask包装
class Th3 implements Callable<String> {
    @Override
    public String call(){
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getId());
        return "i am result";
    }
}
FutureTask<String> futureTask = new FutureTask<>(new Th3());
new Thread(futureTask).start();
String result = futureTask.get(3, TimeUnit.SECONDS);
System.out.println(result);
Executors是一个Java中的工具类 ,阿里巴巴代码规范中禁止使用,因为LinkedBlockingQueue如果不设置大小,它的大小就是int最大值,这样就造成OOM
BlockingQueue是用来存放还未执行的任务的队列
我们使用
ThreadPoolExecutor
setMaximumPoolSize()修改Runable或者Callablesubmit(),参数是第一步的Runable或者Callable,如果使用Runable,可以在第二个参数(可选参数)添加一个结果get(),注意此操作是阻塞的shutdownNow()和shutdown(),shutdown()会阻止添加任务,阻止未开始的任务执行,并且等正在执行的任务完成后,关闭线程池;shutdownNow()会阻止添加任务,阻止未开始的任务执行并且尝试中断所有线程,可能会抛出异常.ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3,
                10,
                60L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10));
//        Future<?> submit = threadPoolExecutor.submit(new Th2(),"我是Th2的结果");
        Future<?> submit = threadPoolExecutor.submit(new Th3());
        // 获取结果
        System.out.println(submit.get());
        //关闭线程池
        threadPoolExecutor.shutdown();
原文:https://www.cnblogs.com/lyalong/p/java_thread.html