首页 > 编程语言 >java多线程

java多线程

时间:2022-08-21 13:46:11浏览次数:60  
标签:Runnable java Thread 接口 线程 多线程 public

一、定义

很多人应该对进程,线程,程序这几个概念混淆.程序指什么?简而言之,程序就是代码,用不同语言编写的代码;什么是进程?进程就是表示程序一次完整的执行;线程指的是,在一个进程中,有多个执行链路,每个执行链路就是一个线程.

从概念来说,进程包含多个线程(至少包含一个线程),线程是CPU调度和分配的最小单位.

并行:多个CPU执行不同的任务

并发:一个CPU执行多个不同的任务

二、实现多线程

在jdk1.5之前,有两种方法创建线程:继承Thread,实现Runnable接口

1.继承Thread类

//步骤:
//1.继承Thread类 public class Test extends Thread{ //2.重写run方法,编写要执行的任务 @Override public void run(){ System.out.println("这是用Thread创建的线程"); } //3.创建该类的对象 public static void main(String[] args) { Test t1 = new Test(); //4.调用start()方法启动该线程 t1.start(); }
}

2.实现Runnable接口

步骤:
//1.实现Runnable接口 public class MyRunnable implements Runnable{ //2.重写run方法 @Override public void run() { //实现 System.out.println("这是用Runnable实现的线程"); } public static void main(String[] args) { //3.创建对象 MyRunnable my = new MyRunnable(); //4.封装成Thread,调用它的start方法运行该线程 Thread t1 = new Thread(my); t1.start(); } }

在jdk1.5之后,又增加了两种方法:实现 Callable接口;线程池

3.实现Callable接口

步骤:
//1.实现Callble接口 public class MyCallable implements Callable { //2.重写call方法 @Override public Object call() throws Exception { System.out.println("这是用Callable实现创建对象"); return "callable"; } public static void main(String[] args) { //3.创建对象 MyCallable my = new MyCallable(); //4.创建FutureTask对象,把接口对象传进去 FutureTask task = new FutureTask(my); //5.创建Thread对象,把FutureTask对象传进,调用Thread里的start方法 Thread t1 = new Thread(task); t1.start(); } }

三、总结

1.使用多线程可以更高效地利用CPU资源,同时,让固定流程的程序更加灵活.

2.但是实现多线程就一定快吗?不是的,这需要看CPU的核数.

3.在实现多线程的过程中,相较于继承Thread方法和实现Runnable接口,推荐使用实现Runnable接口来创建线程.原因:实现Runnable接口可以共享同一个对象目标,非常适合多个线程来处理同一个资源.Thread需要用到继承,在java中,继承提高了类的耦合性,父类改变的话,子类大概率也会有影响,跟封装性这个特征相斥.

4.继承Thread类,缺点是该类就不能再继承其他的类;优点是在访问该线程时,可以直接用this关键字来调用.

5.实现Runnable接口,优点是多个线程可以共享同一个对象目标;它的缺点是访问当前线程,必须使用Thread.currentThread()方法

6.实现Callable接口,需要有返回值,且call方法可以抛出异常,而相较于run方法,它不可以抛出异常;在运行Callable任务时可以拿到一个Future对象,通过Future对象可以了解任务执行情况,可取消任务的执行(cancel(true)方法),还可获取执行结果(get()方法)。

 

标签:Runnable,java,Thread,接口,线程,多线程,public
From: https://www.cnblogs.com/pilpill/p/16609795.html

相关文章

  • Java学习 (25) 对象篇(05)抽象类&接口
    目录抽象类语法实例注意点具体讲解视频(狂神说Java)接口语法实例具体讲解视频(狂神说Java)抽象类abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是......
  • Java学习第一天
    在有C/C++基础的前提下,进行Java学习。 参考教程:https://www.bilibili.com/video/BV18V411W7oc?p=9&share_source=copy_web 垃圾收集GarbageCollection:Java有自动......
  • JAVA对象与JSON转换的各种方法-fastjson
    1<!--https://mvnrepository.com/artifact/com.alibaba/fastjson-->2<dependency>3<groupId>com.alibaba</groupId>4<artifactId>fastjson</artifactId>......
  • Java基础知识
    注释(comment)单行注释://多行注释:/**/文档注释:/***/,javadoc命令可以抽取每个类,方法的文档注释,生成API文档关键字(keyword)关键字是指在程序中已经有特定含......
  • Java学习 (24) 对象篇(04)static关键字
    目录static关键字语法实例代码块语法实例引用库语法实例static关键字static在类中修饰成员变量,在方法中则修饰成员方法static在属性中叫做静态属性,在方法中叫做静态......
  • JAVA基础--运算符--2022年8月20日
    第一节1、算数运算符有哪些+ - * / %2、/需要注意什么,为什么?两个整数相除,结果一定也是整数,因为最高类型是整数 第二节把数字321拆分成3  2......
  • JavaScript(上)
    说说你对作用域链的理解作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变......
  • JSON数据和Java对象的相互转换
    JSON数据和Java对象的相互转换JSON解析器创建的解析器:Jsonlib,Gson,Fastjson,jacksonJSON转为Java对象使用步骤:导入jackson相关的jar包创建Jackson革新对象Obje......
  • Java后端开发需要学什么?
    Java基础Java是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的oop特性:封装、继承、多态。此外还有泛型、反射的特性,很多框架的技术都依赖它,比如S......
  • json转java对象以及校验用户名是否存在案例
    json转java对象使用步骤:1、导入jackson的相关jar包2、创建Jackson核心对象ObjectMapper3、调用ObjectMapper的相关方法进行转换1、readValue(js......