首页 > 编程语言 >java创建线程的几种方式,以及它们之间的区别(面试常用)

java创建线程的几种方式,以及它们之间的区别(面试常用)

时间:2024-08-09 16:55:07浏览次数:10  
标签:Runnable java Thread 创建 Callable 面试 线程 public

线程创建的几种方法

继承Thread类。如果继承了Thread类,直接new一个对象就可以创建一个线程
实现Runnable接口。如果实现了Runnable接口,则还需要用Thread的构造方法,才能创建一个线程

//使用Thread类创建线程并启动线程
public class ThreadTest extends Thread{
    @Override    
    public void run() {        
    System.out.println("hello,Thread");    
    }
    public static void main(String[] args) {        
    //启动线程        
    new ThreadTest().start();    }
}
//使用Runnable创建线程并启动线程
public class RunnableTest implements Runnable{
    public static void main(String[] args) {        
    Thread thread = new Thread(new RunnableTest());        
    //启动线程        
    thread.start();    
    }    
    //重写run方法    
    @Override    
    public void run() {        
    System.out.println("hello,runnable");    
    }
}

Callable和Future创建线程。创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值

//Callble创建线程并启动线程
public class FutureTaskTest implements Callable {
    @Override    
    public Object call() throws Exception {        
    return 4;    
    }    
    public static void main(String[] args) throws ExecutionException, InterruptedException {        
    //创建Callable        
    FutureTaskTest th = new FutureTaskTest();        
    //创建FutureTask,需要绑定Callable        
    FutureTask<Integer> futureTask = new FutureTask<Integer>(th);        
    //开启线程        
    new Thread(futureTask).start();        
    //获取Callable的返回值        
    Integer result = futureTask.get();        
    System.out.println(result);    }
}

使用线程池创建
参考链接【线程池】线程池的7种创建方式,详细讲解-CSDN博客

Thread和Runnable的区别

从资源的节约上来看: 出现一个任务时,Thread方法每次都需要手动去创建一个线程,那么线程的创建和销毁都会消耗比较大的资源。而Runnable通过实现runnable接口的方法实现类,然后将实现的类作为参数加入到Thread()中,而线程Thread可以通过线程池这样的工具创建和管理,这样就可以减少线程的创建和销毁。

从耦合的角度来看: 一个子类只能继承一个父类,Thread方法大大的限制了代码的可扩展性,并且多继承的话,可能出现父类的run方法被子类重写,导致父类里面的run方法被覆盖。

所以终上所述,优先选择Runnable方法。

Callable和Runnable的区别

Callable接口方法是call(),Runnable的方法是run()
Callable接口call方法有返回值,Runnable接口run方法无返回值
Callable接口call()方法允许抛出异常;而Runnable接口run()方法不能抛异常

为什么一般都是使用线程池创建线程,而不是new一个线程?

  1. 不受控风险
  2. 频繁创建开销大
    为什么不受控
    系统资源有限,当系统运行起来,所有线程都在抢占资源,不好管控。
    为什么开销大
    真正转换为操作系统层面创建一个线程,还要调用操作系统内核的API,然后操作系统再为该线程分配一系列的资源。

标签:Runnable,java,Thread,创建,Callable,面试,线程,public
From: https://blog.csdn.net/kiku1002149488/article/details/141036948

相关文章

  • JAVA报错:Caused by: java.lang.NoSuchFieldError: REFLECTION
     Causedby:java.lang.NoSuchFieldError:REFLECTIONatcom.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:93)atcom.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:473)atcom......
  • 京东面试:说说CMS工作原理?
    CMS(ConcurrentMarkSweep)垃圾收集器是以“最短的停顿”著称的垃圾回收器,因此也是JDK9之前使用最广泛的垃圾回收器之一。那么,问题来了,为什么CMS能实现最短停顿时间?CMS垃圾回收器的工作原理又是啥呢?接下来,我们一起来看。CMS工作原理CMS之所以能实现最短停顿时间是和它的......
  • edge浏览器加载java插件的方法
    在MicrosoftEdge浏览器中直接加载Java插件并不是一个直接支持的功能,因为Edge是基于Chromium内核的浏览器,主要支持Web技术如HTML、CSS和JavaScript。Java插件(通常指的是Java小程序,使用Java编程语言编写的应用程序)主要用于在早期的InternetExplorer浏览器中运行,但在现代浏览器中已......
  • 从Java类加载器源码浅析到线上热部署实现
    1Java代码的执行过程写了这么多代码,有没有想过我们的代码是怎么执行的?或者说定义了那么多类,我们的class是怎么加载到内存的?Java语言属于一种高级语言,而cpu能执行的只有机器码,所以Java代码的运行离不开jvm虚拟机的编译,下面用一张图说明在HotSpot虚拟机中Java代码加载到cpu执行的......
  • Java小白入门到实战应用教程-Scanner类及IO流讲解
    Java小白入门到实战应用教程-Scanner类及IO流讲解Scanner类我们前面写的很多例子都是程序独自执行的,但是我们做编程写代码的目的是要实现能人和代码去交互的。现在我们就来了解一个知识点,去实现最简单的人和程序的交互。在java中通过Scanner类来获取用户在控制台的输入......
  • java读取JSON文件并解析
    importcom.fasterxml.jackson.core.type.TypeReference;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.codehaus.jettison.json.JSONObject;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.List;importjava.util.Map;......
  • 关于最近面试的一些心得
    回来了一段时间,在某招聘App上陆续有一些人主动找上门,但是基本都是毫无针对性的询问对岗位是否有意向。也陆续投了一些公司的,但是基本都是石沉大海。一些人跟我说现在大环境不好,招聘的岗位少。这种思维我不敢苟同,只能说很多企业自身经营都成问题,只是借大环境不好来掩盖真实的问......
  • JAVA线程资源共享问题
    JAVA多线程共享资源问题场景引入这个场景是一个典型的多线程共享资源的场景,主要目的是测试和观察多个线程对共享变量sum进行并发操作时是否会出现线程安全问题场景描述共享资源:共享变量sum,初始值为0。多个线程同时对sum进行操作,一个线程负责自增操作,另一个线程负责自......
  • Java - IO流
    (IO随用随创建,不用了就关流)1.字节流OutputStream(字节输出流,写出)FileOutputStreanmoff表示起始索引,len表示截取长度Windows换行符:"\r\n"Linux:"\n"Mac:"\r"续写:创建对象第二个参数写true字节打印流(特有方法会原样输出)无缓冲区,自动刷新无用InputStream(字节输......
  • 1.1javaSE初识
    JDK:JDK是JavaDevelopmentKit的缩写,意为Java语言的软件开发工具包(SDK)。它是Java编程的核心工具,为程序开发者提供了一个完整的开发环境。JRE:Java运行环境,是运行Java程序所必须的环境的集合,包含了JVM(Java虚拟机)和Java核心类库。Java开发工具:包括编译器(javac)、解释器(java)、调试......