一、创建线程和使用线程方式

1.1 继承Thread

让线程类继承自Thread类,然后重写run(),把需要多线程调用的代码放到run()中。但是需要开启线程的时候不能调用run方法,而是需要调用start()方法。

/***  本类用于演示第一种实现多线程的方式*/
class MyThread extends Thread{// 需要我们使用多进程运行的代码就写在run方法里@Overridepublic void run() {       for (int i = 1; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}}
}
public class ThreadDemo01 extends Thread{public static void main(String[] args) {MyThread thread = new MyThread();thread.start();for (int i = 1; i < 5; i++) {   System.out.println(Thread.currentThread().getName() + "线程正在运行======" + i);}}
}

运行结果:(两个线程同时运行,争抢cpu,每次执行结果不固定)

12.2 实现Runnable接口

需要我们创建的线程类实现Runnable接口。实现run方法,把需要多线程调用的代码写在run方法中。由于Runnable接口中只有一个run方法,所以不能直接调用start()。这个时候需要创建一个Thread类的对象来帮助我们开启线程。创建这个Thread类对象的时候需要将我们的线程类作为参数传递给Thread对象。

/***  本类用于演示第二种实现多线程的方式*/
class MyThread2 implements Runnable{// 需要我们使用多进程运行的代码就写在run方法里@Overridepublic void run() {     for (int i = 1; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}}
}public class ThreadDemo02 {public static void main(String[] args) {     MyThread2 myThread2 = new MyThread2();// myThread2.run();// 由于Runable接口只有一个run方法,所以实现Runnable接口的这种方式,线程本身没有start方法。// 但是必须要调用start方法才能开启多线程,所以需要创建Thread类的对象,把我们的线程类作为参数传递给构造方法。Thread thread = new Thread(myThread2);thread.start();for (int i = 1; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);} }
}

运行结果:(两个线程同时运行,争抢cpu,每次执行结果不固定)

2.3 实现Callable接口

采用实现Callable接口实现多线程启动方式以上两种的方式不太一样,下面就看一下怎样启动采用实现Callable接口的线程。

第一步:定义一个类实现Callable接口,并且指定call()返回值的类型。将业务逻辑写在call()方法中。

第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中。

第三步:实例化Thread对象,并在构造方法中传入FurureTask对象。

第四步:启动线程

/***  本类用于演示第三种实现多线程的方式*/
class MyCallable implements Callable<String>{@Overridepublic String call() throws Exception {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~" + i);}return "MyCallable接口执行完成!";} }
public class ThreadDemo03 {public static void main(String[] args) throws  Exception {// 1、创建FutureTask实例,创建MyCallable实例FutureTask<String> futureTask = new FutureTask<>(new MyCallable());// 2、创建Thread实例,来执行futureTaskThread thread = new Thread(futureTask);thread.start();// 3、主线程for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~" + i);}// 4、获取执行结果System.out.println(futureTask.get());}
}

运行结果:

1.4 线程池

在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。

线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。

那么,我们应该如何创建一个线程池那?Java中已经提供了创建线程池的一个类:Executor而我们创建时,一般使用它的子类:ThreadPoolExecutor。

第一步:使用Executors获取线程池对象;

第二步:通过线程池获取对象获取线程并执行Runable子类实例;

class MyThread4 implements Runnable{// 需要我们使用多进程运行的代码就写在run方法里@Overridepublic void run() {     for (int i = 1; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}}
}
public class ThreadDemo04 {public static void main(String[] args) { // 第一步:使用Executors获取线程池对象;ExecutorService executorService = Executors.newFixedThreadPool(10);// 第二步:通过线程池获取对象获取线程并执行Runable实例;executorService.execute(new MyThread4());        for (int i = 1; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "线程正在运行~~~~~~" + i);}     }
}

运行结果:

二、总结

2.1 实现接口和继承Thread类比较

(1)接口更适合多个相同的程序代码的线程去共享同一个资源。

实现Runnable接口这种方式,可以把多线程之间相同的操作放到一个Runnable接口的run方法中实现,然后可以通过多个thread来执行同一个Runnable实例。可以达到在一个地方开发,多个地方使用,做到代码的复用。

(2)接口可以避免Java中单继承的局限性。

Java的设计是单继承的设计,如果采用继承Thread的方式实现多线程,则不能继承其他的类,就会错失继承很多父类方法。

(3)接口代码可以被多个线程共享,代码和线程独立。

(4)线程池只能放入实现Runnable或Callable接口的线程,不能直接放入继承Thread的类。

2.2 Runnable和Callable接口比较

A、相同点:

(1)两者都是接口;

(2)都可以用来编写多线程程序;

(3)两者都需要调用Thread.start()启动线程;

B、不同点:

(1)实现Callable接口的线程能返回执行结果;而实现Runnable接口的线程不能返回结果;若需要用这个线程执行任务,不需要控制则建议使用Runnable,若需要动态监控任务则建议使用Callable。

(2)Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法不允许抛异常。

(3)实现Callable接口的线程可以调用Future.cancel取消执行,而实现Runnable接口的线程不能。

注意点:Callable接口支持返回执行结果,此刻需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取“将来”结果;不调用此方法时,主线程不会阻塞。只能在不需要并发的地方调用get()方法。

多线程调用同一个对象的方法_多线程之如何创建和使用线程相关推荐

  1. 多线程调用同一个对象的方法_这一次,让我们完全掌握Java多线程(2/10)

    多线程不仅是Java后端开发面试中非常热门的一个问题,也是各种高级工具.框架与分布式的核心基石.但是这个领域相关的知识点涉及到了线程调度.线程同步,甚至在一些关键点上还涉及到了硬件原语.操作系统等更底 ...

  2. 多线程调用同一个方法,局部变量会共享吗

    对于一个局部变量应该是各线程独立的,一个线程不会改变另一个线程的临时变量. 多线程时, 几个线程间输出信息是交叉在一起的, 但你又没有区分是哪个线程输出的, 所以你自己就误认为是同一个线程输出的东西被 ...

  3. php 多线程写入文件,C#_C#实现多线程写入同一个文件的方法,本文实例讲述了C#实现多线程 - phpStudy...

    C#实现多线程写入同一个文件的方法 本文实例讲述了C#实现多线程写入同一个文件的方法.分享给大家供大家参考.具体实现方法如下: namespace WfpApp { public partial cl ...

  4. 两个线程调用同一个对象的同一个方法

    两个线程调用同一个对象的同一个方法,会怎么样? public static void main(String[] args) {// System.out.println(String.valueOf ...

  5. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  6. 一个Servlet同一时刻只有一个实例。 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。

    Servlet是一种独立于操作系统平台和网络传输协议的服务器端的Java应用程序.  相同点:  1. 不是独立的应用程序,没有main()方法.  2. 不是由用户调用,由另一个应用程序(容器)调用 ...

  7. 前端的请求最大线程数是多少啊_面试官:创建多少个线程合适,我该怎么说?...

    转载:https://mp.weixin.qq.com/s/j5d4Jtxo0RgJWgpnG9HxlQ 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什 ...

  8. python如何使用多线程_Python 类中的方法如何多线程调用?

    这么写直接弹框报python运行出错,/尴尬,那这个怎么多线程调用getA/getB/getC/getD/getE呢?每次传参还要循环个arg2list列表 class ThreadTest(): d ...

  9. linux多线程调用同一个函数解析

    原文地址:http://blog.csdn.net/mq_ydn3102/article/details/8546722 问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底 ...

最新文章

  1. Redis 笔记(04)— list类型(作为消息队列使用、在列表头部添加元素、尾部删除元素、查看列表长度、遍历指定列表区间元素、获取指定区间列表元素、阻塞式获取列表元素)
  2. Linux7 CENTOS7修改root密码
  3. matlab中的timer模块,[转载]Matlab中Timer的使用
  4. Windows server 2008 R2 登录密码恢复
  5. php 时间戳 时区,PHP时间函数 时间戳 设置时区
  6. MAX9814高性能麦克风
  7. 开源项目成熟度分析工具-利用github api获取代码库的信息
  8. android 价格排序筛选页面,Android应用开发之基于Popupwindow实现的筛选房源信息等相关的可自由排序控件...
  9. 认识ASP.NET MVC的5种AuthorizationFilter
  10. C++中的常用函数例如for_each、accumulate、unique等
  11. 【BZOJ】3993: [SDOI2015]星际战争
  12. Vue.js(二) 模板语法
  13. 联想服务器重装系统快捷键,联想电脑如何重装系统快捷键
  14. java 16 binary_src/ch16/BinaryTree.java · 20162324-春旺/第二学期 - Gitee.com
  15. 原来高手是这样练成的
  16. Uni-App开发框架介绍
  17. 【单片机项目】基于STM32的智能小车设计(三)软件设计
  18. 小寒也会写程序(五)
  19. 100G 数据,只有 100M 内存,怎么排序?
  20. 用c语言写一个简易的四则运算计算器

热门文章

  1. 《Spring Cloud 与 Docker 微服务架构实战》笔记
  2. ObjectArx创建指定块
  3. QtCreator无法编辑源文件
  4. h5页面点击事件ios没反应 移动端兼容性问题
  5. 矩阵快速幂 POJ 3070 Fibonacci
  6. 字符串处理示例--列车车次查询.sql
  7. c#中Excel数据的导入、导出
  8. Jenkins自动编译库并上传服务器
  9. protocol buffers使用说明
  10. 移动开发(C#、VB.NET)Smobiler开发平台——GifView控件的使用方式