首页 > 其他分享 >##线程面试题##

##线程面试题##

时间:2023-09-04 22:09:55浏览次数:35  
标签:面试题 调用 ## submit Callable 任务 Runnable 线程

一.java中线程实现几种实现方式 在Java中实现多线程一共有四种方式: (1)继承Thread类 (2)实现Runable接口 (3)实现Callable接口 (4)线程池 1.继承java.lang.Thread,重写run方法,启动线程,调用start()方法> 2.实现java.lang.Runnable接口,实现run方法 3.实现Callable接口(JDK8新特性) 该方法效率较低,因为在获取线程的执行结果的时候,当前线程受阻塞。但是可以拿到线程的返回结果。call()方法相当于run方法 call方法能向上抛出异常 Runnable是执行工作的独立任务,但是不返回任何值。如果我们希望任务完成之后有返回值,可以实现Callable接口。 FutureTask类提供了一个get()方法用来获取call()方法的返回值,但需要注意的是调用这个方法会导致程序阻塞,必须要等到线程结束后才会得到返回值。 public Object call() throws Exception { return object 类型; } 4,采用匿名内部类的方式

Thread thread=new Thread(new Runnable()
{
@Override
public void run()
 {  
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName());
  }
});
thread.start();

5.线程池 在Java中构建一个新的线程是需要一定的系统开销的,前面三种实现多线程的方法在线程执行完任务后就会将线程销毁, 那么是否可以在线程执行完任务后将线程保存下来,给下一个任务使用呢?答案是可以的,为了解决这个问题,线程池应运而生。 顾名思义,线程池就是用来存储线程的池子。线程池中包含许多准备运行的线程,我们只需要为线程池提供一个个任务, 线程池就会按照一定的规则去调用这些任务,当一个任务完成后,调用这个任务的线程不会死亡, 而是留在线程池中准备为下一个任务提供服务。 Executors类提供了许多静态工厂方法用来构造线程池,这里我介绍其中的三种: 1.newFixedThreadPool(int nThreads) 该方法用来构造一个固定大小的线程池,空闲的线程会一直保留着,如果提交的任务数多于空闲线程数,就会把未得到服务的任务放到队列中等待

public class MyFixedThreadPool {
   public static void main(String[] args) throws ExecutionException, InterruptedException {
       ExecutorService executorService = Executors.newFixedThreadPool(3);
       // 调用 Runnable 任务
       TestRunnable1 testRunnable1 = new TestRunnable1();
       for (int i = 0; i < 5; i++) {
             // 调用 Runnable 任务可以用以下两种方法,二者的区别在于前者没返回值,后者有返回值
           //第一种方法
       	executorService.execute(testRunnable1);
       	 //第二种方法
           Future<?> submit = executorService.submit(testRunnable1);
       }
       // 调用 Callable 任务
       TestCallable1 testCallable1 = new TestCallable1();
       for (int i = 0; i < 5; i++) {
           // 调用 Callable 任务只能用这一种方法
           Future<Integer> submit = executorService.submit(testCallable1);
           System.out.println("返回值:" + submit.get());
       }
   }
 }
   class TestRunnable1 implements Runnable {
   @Override
   public void run() {
       System.out.println("我是 Runnable 任务,调用我的线程是:" + Thread.currentThread().getName());
   }
  }
class TestCallable1 implements Callable<Integer> {
   @Override
   public Integer call() throws Exception {
       System.out.println("我是 Callable 任务,调用我的线程是:" + Thread.currentThread().getName());
       return 666;
   }
  }

2.newCachedThreadPool() 该方法构建的线程池会立即执行任务,如果当前存在空闲线程,则直接执行任务;如果当前不存在空闲线程,则创建一个新线程执行任务。在该线程池内空闲线程只会保留60秒

public class MyCachedThreadPool {
   public static void main(String[] args) throws ExecutionException, InterruptedException {
       ExecutorService executorService = Executors.newCachedThreadPool();
       // 调用 Runnable 任务
       TestRunnable2 testRunnable2 = new TestRunnable2();
       for (int i = 0; i < 5; i++) {
           // 调用 Runnable 任务可以用以下两种方法,二者的区别在于前者没返回值,后者有返回值
           executorService.execute(testRunnable2);
           Future<?> submit = executorService.submit(testRunnable2);
       }
       // 调用 Callable 任务
       TestCallable2 testCallable2 = new TestCallable2();
       for (int i = 0; i < 5; i++) {
           // 调用 Callable 任务只能用这一种方法
           Future<Integer> submit = executorService.submit(testCallable2);
           System.out.println("返回值:" + submit.get());
       }
   }
}
 class TestRunnable2 implements Runnable {
   @Override
   public void run() {
       System.out.println("我是 Runnable 任务,调用我的线程是:" + Thread.currentThread().getName());
   }
 }

class TestCallable2 implements Callable<Integer> {
   @Override
   public Integer call() throws Exception {
       System.out.println("我是 Callable 任务,调用我的线程是:" + Thread.currentThread().getName());
       return 666;
   }
}

3.newSingleThreadExecutor() 该方法构建的线程池只存在一个线程,会顺序地执行所提交的任务。

public class MySingleThreadExecutor {
public static void main(String[] args) throws ExecutionException, InterruptedException {
       ExecutorService executorService = Executors.newSingleThreadExecutor();
      
 // 调用 Runnable 任务
TestRunnable3 testRunnable3 = new TestRunnable3();
       for (int i = 0; i < 5; i++) {
           // 调用 Runnable 任务可以用以下两种方法,二者的区别在于前者没返回值,后者有返回值
           executorService.execute(testRunnable3);
           Future<?> submit = executorService.submit(testRunnable3);
       }
       // 调用 Callable 任务
       TestCallable3 testCallable3 = new TestCallable3();
       for (int i = 0; i < 5; i++) {
           // 调用 Callable 任务只能用这一种方法
           Future<Integer> submit = executorService.submit(testCallable3);
           System.out.println("返回值:" + submit.get());
       }
   }
}  

class TestRunnable3 implements Runnable 
{
   @Override
   public void run() {
       System.out.println("我是 Runnable 任务,调用我的线程是:" + Thread.currentThread().getName());
   }
 }

class TestCallable3 implements Callable<Integer> {
   @Override
public Integer call() throws Exception {
       System.out.println("我是 Callable 任务,调用我的线程是:" + Thread.currentThread().getName());
       return 666;
   }
 }

标签:面试题,调用,##,submit,Callable,任务,Runnable,线程
From: https://blog.51cto.com/u_16243704/7354851

相关文章

  • 加密市场底部特征明显!避险情绪正主导市场走势?
       据8月的经济数据,美国经济终于出现了一些减速的迹象。美国7月CPI同比上升3.2%,虽结束了连续12个月的回落,但仍低于市场预期。核心CPI同比上升4.7%,也略低于预期。这表明通胀压力在一定程度上有所增加,但增速仍不太高。    此外在就业方面,非农业部门新增就业人数为18.7万,低于市......
  • MySQL数据库
    正在学习软件测试--MySQL数据库,本文内容是我总结的一些MySQL发展史、概念和常用命令总结。本文用的是服务器,运用Docker容器进行部署的MySQLMySQL数据库MySQL发展史数据库从20实际50年代中期开始,计算机应用有科学研究逐渐扩展到企业、行政等社会的各个领域,数据处理已成为计算机的主......
  • 人大金仓数据库设置大小写敏感
    人大金仓数据库设置大小写敏感初识人大金仓(Kingbase)是中国人民大学信息技术中心开发的一款关系型数据库管理系统(DBMS)。它是基于PostgreSQL开发的,具有与PostgreSQL兼容的语法和功能,同时也提供了一些特定的优化和扩展,以满足特定的商业需求。特点高度兼容性:人大金仓兼容Pos......
  • [C++] std::optional与RVO:最高效的std::optional实践与探究
    返回值优化RVO在cppreference中,是这么介绍RVO的Inareturnstatement,whentheoperandisthenameofanon-volatileobjectwithautomaticstorageduration,whichisn'tafunctionparameteroracatchclauseparameter,andwhichisofthesameclasstype(igno......
  • 14.MySQL数据库设计详解
    MySQL数据库设计需要根据具体的业务需求和数据模型来制定,以下是一个示例数据库设计,包括创建表、定义索引、外键关系和示例数据插入的MySQL代码。这个示例涵盖了一个简单的电子商务系统,包括用户、产品和订单数据。--创建用户表CREATETABLEusers(user_idINTAUTO_INCREM......
  • 扫描线补充
    1.两条扫描线之间,不一定是一个矩形,可能是多个不相交的,高相同的矩形2.扫描线的板子没有pushdownvoidupd(intu,intl,intr){ if(cnt[u]){ len[u]=b[r+1]-b[l]; sum[u]=2; lh[u]=rh[u]=1; }else{ len[u]=len[lch]+len[rch]; sum[u]=sum[lch]+sum[rch]; lh[u]=lh[......
  • 建管家旗下捷项工程管软件,全面满足企业级数字化管控需求
     在数字化时代的浪潮下,建设工程行业的数字化转型正面临着一系列的管理痛点。为了解决这一问题,以建管家大数据服务平台为支撑构建的企业级数字化管控系列软件产品——捷项工程管理软件应运而生,有效解决建设工程行业面临的数字化挑战。 许多建设工程企业由于处在数字化转型初期......
  • JavaWeb项目3.0之后创建web项目
    在上一篇文章中我们看到创建web项目的过程,但是在web3.0之后有了注解的加入,可以更简单的创建Web项目。选择自己创建的maven项目,填写项目名称。 在项目中添加web模块 添加对应的打包形式 配置tomcat 添加对应模块  最为重要的我们不需要web.xml的繁琐......
  • conda
    //下面是创建python=3.6版本的环境,取名叫py36condacreate-npy36python=3.6 删除环境(不要乱删啊啊啊)condaremove-npy36--all 激活环境//下面这个py36是个环境名condaactivatepy36(conda4之前的版本是:sourceactivatepy36) 退出环境condadeactivate(co......
  • ospf理论
    OSPF的防环机制:ospf区域内防环:spf算法,自动选择最短路径ospf区域间防环: 为防止区域间的环路OSPF定义了骨干区域和非骨干区域和三类LSA的传递规则。OSPF划分了骨干区域和非骨干区域,所有非骨干区域均直接和骨干区域相连且骨干区域只有一个,非骨干区域的通信都要通过骨干区域......