多线程面试题

Java中多线程实现方式?

继承Thread类,重新run方法

//1,定义一个线程类继承Thread类
public class MyThread extends Thread{
    //2,重写run方法
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程执行输出" + i);
        }
    }
}

public class ThreadTest {
    public static void main(String[] args) {
        //3,new一个线程对象
        Thread t1 = new MyThread();
        //4,调用start方法启动线程(执行的是run方法)
        t1.start();
    }
}

实现Runnable接口,重新run方法

//1,定义一个线程任务类,实现Runnable接口
class MyRunnable implements Runnable{
    //2,重写run方法,定义线程执行的任务
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程执行输出 " + i);
        }
    }
}

public class RunnableTest {
    public static void main(String[] args) {
        //3,创建一个任务对象
        Runnable target = new MyRunnable();
        //4,把任务对象交给thread处理
        Thread thread = new Thread(target);
        //5,启动线程
        thread.start();
    }
}

实现Callable接口,重写call方法,带有返回值

//线程创建方式三:
//1,定义一个任务类   实现Callable接口    申明线程任务执行完毕后的结果类型
class MyCallable implements Callable<String>{
    //2,重写call方法(任务方法)
    @Override
    public String call() {
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += i;
        }
        return "sum= "+sum;
    }
}
    
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableTest {
    public static void main(String[] args) {
        //3,创建Callable任务对象
        Callable callable = new MyCallable();
        //4,把Callable任务对象,交给FutureTask对象
        //FutureTask对象的作用1:FutureTask实现了Runnable接口,可以交给Thread
        //FutureTask对象的作用2:线程执行完可以通过调用get方法得到线程执行结果
        FutureTask futureTask = new FutureTask(callable);
        //5,交给线程处理
        Thread thread = new Thread(futureTask);
        //6,启动线程
        thread.start();
        try {
            String result = (String) futureTask.get();
            System.out.println(result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

线程池

线程池–Runnable方式
import java.util.concurrent.*;

public class ThreadPoolRunnable {
    public static void main(String[] args) {
        /**
         *int corePoolSize主线程个数:正式工,
         *int maximumPoolSize最大线程个数:正式工+临时工,
         *long keepAliveTime临时工工作完多久释放,
         *TimeUnit unit时间单位,
         *BlockingQueue<Runnable> workQueue工作队列:等待区线程最大个数,也就是最多几个任务在等待被线程执行,
         *ThreadFactory threadFactory线程工厂hr,
         *RejectedExecutionHandler handler拒绝策略
         */
        ExecutorService pool = new ThreadPoolExecutor(3,5,5, TimeUnit.SECONDS
                ,new ArrayBlockingQueue<>(6)
                ,Executors.defaultThreadFactory()
                ,new ThreadPoolExecutor.AbortPolicy());
        for (int i = 1; i <= 11; i++) {
            pool.execute(new MyRunnable());
        }
        //rejected from java.util.concurrent.ThreadPoolExecutor@135fbaa4[Running, pool size = 5, active threads = 5, queued tasks = 6, completed tasks = 0]
        //at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
        //最大线程容量5+最大等待线程数量6,so,当线程数量>11时,就会报出来
    }
}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"正在执行");
    }
}
线程池–Callable方式
import java.util.concurrent.*;

public class ThreadPoolCallable {
    public static void main(String[] args) {
        /**
        *int corePoolSize,
        *int maximumPoolSize,
        *long keepAliveTime,
        *TimeUnit unit,
        *BlockingQueue<Runnable> workQueue,
        *ThreadFactory threadFactory,
        *RejectedExecutionHandler handler
        */
        ExecutorService pool = new ThreadPoolExecutor(3,5,5, TimeUnit.SECONDS
                ,new ArrayBlockingQueue<>(6)
                ,Executors.defaultThreadFactory()
                ,new ThreadPoolExecutor.AbortPolicy());
        //线程池去执行线程,返回Future对象
        Future<String> future1 = pool.submit(new MyCallable(5));
        Future<String> future2 = pool.submit(new MyCallable(6));
        Future<String> future3 = pool.submit(new MyCallable(7));
        try {
            //返回线程返回值
            System.out.println(future1.get());
            System.out.println(future2.get());
            System.out.println(future3.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

class MyCallable implements Callable<String> {
    private int n;
    public MyCallable(int n) {
        this.n = n;
    }
    @Override
    public String call() {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum+=i;
        }
        return Thread.currentThread().getName()+",0~"+n+";sum = "+sum;
    }
}

相关推荐

  1. 线面试

    2024-04-01 10:52:04       32 阅读
  2. 面试态结合线

    2024-04-01 10:52:04       40 阅读
  3. 安卓面试线16-20

    2024-04-01 10:52:04       38 阅读
  4. 安卓面试线41-45

    2024-04-01 10:52:04       32 阅读
  5. 安卓面试线 91-95

    2024-04-01 10:52:04       36 阅读
  6. 安卓面试线 61-65

    2024-04-01 10:52:04       35 阅读
  7. 安卓面试线 66-70

    2024-04-01 10:52:04       34 阅读
  8. 安卓面试线 86-90

    2024-04-01 10:52:04       43 阅读
  9. 安卓面试线 121-125

    2024-04-01 10:52:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 10:52:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 10:52:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 10:52:04       82 阅读
  4. Python语言-面向对象

    2024-04-01 10:52:04       91 阅读

热门阅读

  1. Photoshop笔记大全

    2024-04-01 10:52:04       39 阅读
  2. android中include标签

    2024-04-01 10:52:04       34 阅读
  3. 【Go】面向萌新的Gin框架知识梳理学习笔记

    2024-04-01 10:52:04       29 阅读
  4. StatefulSet介绍-更新-扩容缩容-HPA

    2024-04-01 10:52:04       27 阅读
  5. 2024.3.31力扣(1200-1400)刷题记录

    2024-04-01 10:52:04       37 阅读
  6. 著名的分布式数据库

    2024-04-01 10:52:04       30 阅读
  7. 从适用场景看,Spring Boot和Spring的不同

    2024-04-01 10:52:04       38 阅读
  8. Servlet

    Servlet

    2024-04-01 10:52:04      31 阅读
  9. Spring Boot集成Elasticsearch 8.12.2客户端

    2024-04-01 10:52:04       35 阅读