1.线程的八大核心基础知识之实现多线程的方式

一.思维导图

二.实现多线程的方法

1.官方说法为两种

(1)Runnable

/**
 * 用Runnable方式创建线程
 */
public class RunnableStyle implements Runnable{


    @Override
    public void run() {
        Thread thread = new Thread(new RunnableStyle());
        thread.start();
    }

    public static void main(String[] args) {
        System.out.println("用Runnable方式创建线程");
    }
}

(2)Thread

/**
 * 用Thread方式实现线程
 *
 */
public class ThreadStyle extends Thread {

    @Override
    public void run() {
        System.out.println("用Thread类实现线程");
    }

    public static void main(String[] args) {

        new ThreadStyle().start();
    }
}

(3)两种方法对比

 (4)同时用两种方法实现会怎么样

/**
 * 同时使用Runnable 和 Thread 两种实现线程的方法
 */
public class BothRunnableThread {

    public static void main(String[] args) {
        //使用匿名内部类创建线程
        new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("传入Runnable方式重写run方法");
            }
        }) {
            @Override
            public void run() {
                System.out.println("直接将Thread中的run方法重写");
            }
        }.start();
    }
}

结果:

 分析:

  • 首先我们创建了一个Thread的匿名内部类,传入参数为实现了Runnable接口的对象,最后匿名内部类再重写run方法

  • 我们查看Thread的构造函数,传入的实现了Runnable接口的匿名对象会被赋值到target属性,如果启动线程就会调用传入的Runnable接口匿名对象重写的run方法,之后我们又重写了Thread的run方法,再一次修改了run方法。

 (5)总结

2.典型错误观点分析

(1)使用线程池创建线程的方式:本质上还是Thread创建线程的

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool5 {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 100; i++) {
            executorService.submit(new Task());
        }
    }
}

class Task implements Runnable {

    @Override
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName());
    }
}

(2)通过Callable和FutureTask创建线程的方式:本质上还是使用Runnable和Thread实现的

 (3)使用定时器的方式创建线程:TimerTask实现了Runnable接口

import java.util.Timer;
import java.util.TimerTask;

public class DemoTimerTask {

    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        },1000,1000);
    }
}

(4)总结:

3.彩蛋

 

 

 

 4.常见的面试题

 

猜你喜欢

转载自www.cnblogs.com/zhihaospace/p/12466797.html