不多说,直接上干货!

有4种方式可以用来创建线程:
  第一种:继承Thread类,重写run方法
  第二种:实现Runnable接口,并实现该接口的run方法(一般我们在编程的时候推荐用这种)

  第三种:实现Callable接口,重写run方法
  第四种:应用程序可以使用Executor框架来创建线程池

  

第一种:继承Thread类,重写run方法,不带返回值

  继承Thread类(真正意义上的线程类),是Runnable接口的实现。

class  MyThread extends Thread
public void
run() { 
System.out.println("Thread body");//线程的函数体
} public class Test
public static void main(String ] args) { 
MyThread thread = new MyThread ();
     thread.start();//开启线程
  } 
}

  

第二种:实现Runnable接口,实现run方法,不带返回值

  但是比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性;

  一般情况下,常见的是这种。

    Runnable接口有如下好处:

    ①避免点继承的局限,一个类可以继承多个接口。

    ②适合于资源的共享

  实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

  主要步骤如下:

    (1)自定义类并实现Runnable接口,实现run方法。

    (2)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。

     (3)调用Thread的start方法。


class  MyThread implements Runable {  //创建线程类
public void
run() { 
System.out.println("Thread body");
}
} public class Test { 
public static void main(String ] args) { 
MyThread thread = new MyThread();
Thread t = new Thread(thread);
t.start(); //开启线程
}
}

第三种:实现callable接口,重写call方法,带返回值

  可以获取返回值,缺点是比较繁琐。

  Callable接口实际是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。主要如下:

  (1)Callable可以在任务结束后提供一个返回值,而Runnable无法提供这个功能。

  (2)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。

  (3)运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况。当调用Future的get()方法以获取结果时,当前线程就会阻塞,指导call()方法结束返回结果。

import  Java.util.concurrent.*;

public  class CallableAndFuture {   //创建线程类
public static class CallableTest implements Callable <String> { 
public String call() throws Exception { 
return "Hello World!";
}
} public static void main(String ] args) { 
ExecutorService threadPool = Executors.newSingleThreadExecutor();//启动线程
Future<String> future = threadPool.submit(new CallableTest());
try { 
System.out.println("waiting thread to finish");
System.out.println(future.get());//等待线程结束,并获取返回结果
} catch (Exception e) { 
e.printStackTrace();
}
  }
}

第四种:使用实现了Executor接口的ThreadPoolExecutor来创建线程池

  用Executor框架来创建,包含了很多并发处理以及线程池的方法。

牛客网Java刷题知识点之四种不同的方式创建线程的更多相关文章

  1. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  2. 牛客网Java刷题知识点之调用线程类的start()方法和run()方法的区别

    不多说,直接上干货! 前期博客 牛客网Java刷题知识点之四种不同的方式创建线程 这里很简单 首先,系统通过调用线程类的start()方法来启动一个线程,此时这个线程处于就绪状态,而非运行状态,也就意 ...

  3. 牛客网Java刷题知识点之为什么HashMap和HashSet区别

    不多说,直接上干货! HashMap  和  HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...

  4. 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  5. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  6. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  7. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  8. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  9. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

随机推荐

  1. boost asio中io_service类的几种使用

    io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操 ...

  2. Python:collections的deque()方法

    转于:https://www.cnblogs.com/zhenwei66/p/6598996.html 博主:http://www.cnblogs.com/zhenwei66/(渐晨) python3 ...

  3. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

    目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...

  4. 给JZ2440开发板重新分区

    转自:http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328035&idx=1&sn=7d3935cc05d3 ...

  5. WCF服务用户名密码访问

    有2种方式, 第一直接在程序中指定用户名密码,配置调用 private void BtnSearch_Click(object sender, EventArgs e) { try { var cli ...

  6. List for game to play latter

    1.The Elder Scrolls V 2.Border Lands 1,2 3.Mind Killer 4.Dark Soul 2 5.Watch Dog 6.Valkyria Chronicl ...

  7. 10、RNA-seq for DE analysis training(Mapping to assign reads to genes)

    1.Goal of mapping 1)We want to assign reads to genes they were derived from 2)The result of the mapp ...

  8. Luogu 2668 [NOIP2015]斗地主

    打牌技术不精,没有把$A$放在顺子里面搜,WA了好长时间. 盗用大佬的一张图: 当时自己搜的时候没有把四张牌拆成三带一等情况. 然后还有一点就是四张三张都出完之后直接数一数剩下的一张两张牌还要多少次出 ...

  9. 6.7 使用IDEA导入工程

    打开IDEA->File->new -> Project from existing ..->选择你的工程,导入: 请注意,在130或者40上面的项目并不是最新的,sunny也 ...

  10. IPv4 和 IPv6地址

    目前Internet上使用的基本都是IPv4地址,也就是说地址总共是32个比特位,也就是32位二进制数.  所以IPv4地址总的容量是 2的32次方 = 4294967296 比如 11010010 ...