java创建线程的7种方式

  1. 继承Thread类并重写run()方法

    public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(this.getId()+this.getName()+ " is running");
    }
    
    public static void main(String[] arg){
        new MyThread().start();
    new MyThread().start();
    new MyThread().start();
    new MyThread().start();
    }
    }
    
    $ "C:\Program Files\Java\jdk1.8.0_171\bin\java.exe"
    12Thread-0 is running
    15Thread-3 is running
    13Thread-1 is running
    14Thread-2 is running
    
    Process finished with exit code 0
    
  2. 实现Runnable接口

    public class MyThread implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" is running");
    }
    public static void main(String[] args){
        new Thread(new MyThread()).start();
    new Thread(new MyThread()).start();
    new Thread(new MyThread()).start();
    new Thread(new MyThread()).start();    }
    }
    
  3. 匿名内部类

    public class MyThread {
    public static void main(String[] args){
        new Thread(){
            public void run(){
                System.out.println(this.getName() + " is running");
    }
        }.start();   new Thread(new Runnable() {
            @Override
    public void run() {
                System.out.println(Thread.currentThread().getName() + " is running");
    }
        }).start();   new Thread(()->{
            System.out.println(Thread.currentThread().getName()+" is running");
    }).start();    }
    }
    
  4. 实现Callabe接口

    public class MyThread implements Callable<Long> {
    
    @Override
    public Long call() throws Exception {
        Thread.sleep(2000);
    System.out.println(Thread.currentThread().getName()+" is running");
    return Thread.currentThread().getId();
    }
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new MyThread());
    new Thread(futureTask).start();
    System.out.println("等待完成任务");
    Long result = (Long) futureTask.get();
    System.out.println("任务结果是:" + result);
    }
    }
    
  5. 定时器(java.util.Timer)

    public class MyThread {
    public static void main(String[] args){
        Timer timer = new Timer();
    timer.schedule(new TimerTask() {
            @Override
    public void run() {
                System.out.println(Thread.currentThread().getName() + " is running");
    }
        }, 0, 1000);
    }
    }
    
  6. 线程池

    public class MyThread {
    
    public static void main(String[] args){
    
        ExecutorService threadPool  = Executors.newFixedThreadPool(10);
    for (int i =0; i< 100; i++){
    
            threadPool.execute(()->System.out.println(Thread.currentThread().getName()+" is running"));    }
    }
    }
    
  7. 并行计算

    public class MyThread {
    
    public static void main(String[] args){
    
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    list.stream().forEach(System.out::print);    System.out.println();
    list.parallelStream().forEach(item->System.out.print(item));
    }
    }
    

总结

上面介绍了那么多创建线程的方式,其实本质上就两种,一种是继承Thread类并重写其run()方法,一种是实现Runnable接口的run()方法。