Skip to content

线程基础

为什么要多线程

当我们的应用程序需要执行多个任务, 并希望通过使这些任务同时运行来提高性能和响应时, 就需要使用多线程来实现;

使用多线程编程可以更有效地利用计算资源, 同时确保应用程序的流畅运行.

线程创建方式

线程是比较轻量的, 与进程相比, 线程消耗的资源较少, 因为线程可以共享相同进程的内存空间;

在 Java 线程模型中, 可以在同一个程序中使用多个线程执行不同任务的, 线程的存在提高了程序性能和响应能力;

实现 Runnable 接口

通过实现 Runnable 接口, 重写 run() 方法, 接着将实现类的实例作为参数传到 Thread 类中, 实现线程.

java
// 私有静态内部类
private static class RunnableThread implements Runnable {
    @Override
    public void run() {
        System.out.println("当前线程: " + Thread.currentThread().getName());
        System.out.println("使用Runnable创建线程 ... ");
    }
}
public static void main(String[] args) {
    RunnableThread runnableThread = new RunnableThread();
    Thread thread = new Thread(runnableThread);
    System.out.println("当前为主线程: " + Thread.currentThread().getName());
    thread.start();
}

继承 Thread 类

通过继承 Thread 类来实现线程, 覆盖 run() 方法自定义线程操作, 将Thread子类实例化之后, 调用 start() 即可启动另一个线程;

java
private static class ThreadChild extends Thread {
    @Override
    public void run() {
        System.out.println("当前线程: " + Thread.currentThread().getName());
        System.out.println("继承Thread实现多线程 ... ");
    }
}
public static void main(String[] args) {
    ThreadChild child = new ThreadChild();
    child.start();
    System.out.println("主线程: " + Thread.currentThread().getName());
}

实现 Callable 接口

除了实现 Runnable 接口之外, 还可以实现 Callable 接口来创建线程, 不同的是Callable创建的线程是有返回值的, 通过泛型指定返回值类型, 把线程执行结果作为返回值返回;

java
private static class CallableThread implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("当前线程: " + Thread.currentThread().getName());
        System.out.println("使用Callable创建线程 ... ");
        Random random = new Random();
        return random.nextInt();
    }
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
    CallableThread callableThread = new CallableThread();
    FutureTask<Integer> futureTask = new FutureTask<>(callableThread);
    Thread thread = new Thread(futureTask);
    thread.start();
    Integer result = futureTask.get();
    System.out.println(result);
}

线程主要参数及接口

优先级

线程的优先级用于指定线程的执行顺序, 通常优先级越高的线程会优先执行;

参考资料