创建线程的方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建线程的方式相关的知识,希望对你有一定的参考价值。

参考技术A 一、继承Thread类创建线程子类
1.在这子类中重写run方法,在run方法内写线程任务代码
2.创建该子类实例,即是创建了一个线程实例
3.调用该实例的start方法来启动该线程
二、建一个类去实现Runnable接口
1.该类去实现接口的run方法,run方法内写线程任务代码
2.创建该类实例,把该实例当作一个标记target传给Thread类,如:Thread t = new Thread(该类实例);即创建一个线程对象
3.调用线程的star方法来启用该线程
参考技术B 我们常见的有两种,一个是继承thread类,另一个是实现runnable接口。实现runnable接口和继承Thread类两种实现多线程方式的区别

然后对四种方式进行一个简单分类:

无返回值:

1.继承thread类

2.实现runnable接口

有返回值:

3.callable接口

4.线程池

也可以说是三种方式,线程池是一种封装好的技术。

实现callable接口会有一个泛型,这泛型即代表返回值的类型。重写call()方法,得到返回值。然后注意这里使用的时候是先将实例传入FutureTask,然后再将FutureTask传入thread类。然后再start。然后调用FutureTask的get方法就可以取得返回值,这里要注意,只有线程结束运行了才能获取到返回值,不然会一直等待,在等待计算线程出结果之前你可以先做其他事情。当然,你不知道它什么时候会结束,所以你只能在必须等待这个线程结果调用get()方法进行阻塞。如果线程一开始你就调用get方法阻塞住,那就和单线程没区别了。

这里我的理解是:实现callable接口是比较适合去固定完成一个任务,比如计算数据,去确认一件事情之类的,这样开启一个线程去做这种事情的效率就比单线程的效率比较高,这样在主线程中可以做着别的事情先,后面再需要的时候再取出来。

然后来看线程池:

其实所有的池技术都是一个道理:当创建和销毁过于频繁的时候,就会非常消耗系统资源,影响系统性能和响应速度,netty的内存池,数据库连接池,线程池,都是一样的,只不过是对象不同,但目的都是类似。所以才导致了池技术的产生。

线程八大基础核心一(创建线程的方式)

1.引子

  在java多线程并发编程中,有八大基础核心。考考你:看看都有哪八大基础核心呢?它们分别是:
  1.创建线程的方式
  2.线程启动
  3.线程停止
  4.线程生命周期
  5.线程相关的方法
  6.线程相关的属性
  7.线程异常处理
  8.线程安全

  今天我们从第一个基础核心开始:创建线程的方式

2.考考你

#考考你:
你知道在java编程语言中,有几种创建线程的方式吗?

#参考如下:网友说法、官方文档

网友说法:

技术图片

 

 

 官方文档说法:

技术图片

 

 

 

#说法比较:
在网络上,关于创建线程的方式。主流的说法有四种:继承Thread、实现Runnable、线程池、Callable与Future

在官方文档,关于创建线程的方式。有且仅有两种:继承Thread、实现Runnable

#答案:
在java编程语言中,创建线程的方式,我们以官方文档为准,只有两种。关于说线程池、Callable与Future是项目开发中常用的方式,它们的底层其实还是Runnable。

 

3.继承Thread

 1 package com.anan.thread.createthread;
 2 
 3 public class ThreadDemo {
 4 
 5     public static void main(String[] args) {
 6         // 创建线程对象,并启动
 7         Thread t1 = new MyThread();
 8         t1.start();
 9     }
10 }
11 
12 /**
13  * 继承Thread方式,创建线程
14  */
15 class MyThread extends Thread{
16 
17     @Override
18     public void run() {
19         System.out.println("继承Thread方式,创建线程");
20     }
21 }

执行结果:

技术图片

 

 

 

 

4.实现Runnable

 1 package com.anan.thread.createthread;
 2 
 3 public class RunnableDemo {
 4 
 5     public static void main(String[] args) {
 6         // 创建线程对象,并启动
 7         Runnable r1 = new MyRunnable();
 8         Thread t1 = new Thread(r1);
 9         
10         t1.start();
11 
12     }
13 }
14 
15 /**
16  * 实现Runnable接口,创建线程
17  */
18 class MyRunnable implements Runnable{
19 
20     public void run() {
21         System.out.println("实现Runnable接口,创建线程");
22     }
23 }

执行结果:

技术图片

 

 

 

5.讨论分享

#实际开发中,哪一种创建线程的方式更好?
1.虽然在java编程语言中,有两种创建线程的方式:继承Thread、实现Runnable
2.在实际开发中,推荐使用实现Runnable接口方式,原因有:
  2.1.实现Runnable接口方式,可以将线程处理业务,与创建线程分离,从而解耦
  2.2.实现Runnable接口方式,扩展性更好,因为在java编程语言中,只能继承一个父类,而可以实现多个接口
  2.3.实现Runnable接口方式,配合线程池使用,有更好的资源利用率和性能

 

以上是关于创建线程的方式的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程 - Java创建线程的4种方式

创建线程的常见的几种方式

多线程(六):线程池

多线程(六):线程池

线程八大基础核心一(创建线程的方式)

JAVA线程能创建线程吗