Java并发控制基础篇 Thread继承类和Runnable实现类
来源:互联网 发布:java web直播开源系统 编辑:程序博客网 时间:2024/06/10 01:02
更多面试题请狠狠的点击 下载
在我们面试的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些线程,当问题比简单时一个或者几个线程就OK了,也涉及不到效率问题。一旦线程数量多起来的时候,必然躲不过这些线程的创建与销毁,而往往这是很浪费时间的。这时就需要利用线程池来进行管理,既免去了我们创建线程和销毁线程的代码,也提高了程序的效率。下面针对以上问题做出相关讲解。
一、Runnable、Thread比较
首先阐述实现Runnable的好处:
- java不允许多继承,因此实现了Runnable接口的类可以再继承其他类。
- 方便资源共享,即可以共享一个对象实例???(从很多博客中看到这样描述,但是此处有疑问,例子如下)
下面来通过具体代码来解释上述优点,网上很流行的买票系统,假设有5张票,首先通Thread来进行购买。代码如下:
一:通过继承Thread类来实现买票
public class OwnThread extends Thread{private int ticket=5;//票数5private String name;public OwnThread(String name) {this.name=name;}public void run() {for(int i=1;i<=5;i++){if(ticket>0)System.out.println(this.name+",卖票:"+this.ticket--);}}}
测试类:public class TestThread {public static void main(String[] args) {Thread t1=new OwnThread("张大锤");Thread t2=new OwnThread("方进钟");t1.start();t2.start();}}
效果如图:
二。实现Runnable接口
public class MyThread implements Runnable {private int ticket=5;//利用火车卖票public void run() {for(int i=1;i<=5;i++){if(ticket>0)System.out.println(Thread.currentThread().getName()+",卖票了:"+ticket--);}}}测试类
public class TestThread {public static void main(String[] args) {Runnable r=new MyThread();Thread t1=new Thread(r,"张大锤");Thread t2=new Thread(r,"方进钟");t1.start();t2.start();}}效果图:
Runnable和Thread区别
实际开发中我们通常采用Runnable接口来实现多线程。因为实现Runnable接口比继承Thread类有如下好处:
1. 避免继承的局限,一个类可以继承多个接口,但是类只能继承一个类。
2. Runnable接口实现的线程便于资源共享。而通过Thread类实现,各自线程的资源是独立的,不方便共享。上面例2可以看出线程a跟线程b各卖了5张票,而例子3两个线程共卖了5张票,而且没有重复。
二、线程池
创建线程池主要有三个静态方法供我们使用,由Executors来进行创建相应的线程池:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- newSingleThreadExecutor返回以个包含单线程的Executor,将多个任务交给此Exector时,这个线程处理完一个任务后接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代。
- newFixedThreadPool返回一个包含指定数目线程的线程池,如果任务数量多于线程数量,那么没有执行的任务必须等待,直到有任务完成为止。
- newCachedThreadPool根据用户的任务数创建相应的线程来处理,该线程池不会对线程数目加以限制,完全依赖于JVM能创建线程的数量,可能引起内存不足。
- newScheduledThreadPool创建一个至少有n个线程空间大小的线程池。此线程池支持定时以及周期性执行任务的需求。
我们只需要把实现了Runnable的类的对象实例放入线程池,那么线程池就自动维护线程的启动、运行、销毁。我们不需要自行调用start()方法来开启这个线程。线程放入线程池之后会处于等待状态直到有足够空间时会唤醒这个线程。
- Java并发控制基础篇 Thread继承类和Runnable实现类
- Java线程示例 - 继承Thread类和实现Runnable接口
- Java 继承Thread类和实现Runnable接口的区别
- Java 继承Thread类和实现Runnable接口的区别
- 黑马程序员--基础加强--第四篇--继承Thread类和实现Runnable接口有什么区别?
- 【Java基础_(线程篇_第一篇)】继承Thread;实现runnable;sleep、wait用法和区别;Thread和Runnable区别;线程停止
- Java继承thread类与实现Runnable接口
- JAVA 线程的两种基本实现方法(继承Thread类和实现Runnable接口)
- java实现多线程的两种方式继承Thread类和实现Runnable接口
- 继承Thread类和实现Runnable接口的区别。
- 继承Thread父类和实现Runnable接口的区别
- 继承Thread类和实现Runnable接口的对比
- 实现Runnable接口和继承Thread类区别
- java多线程学习1-继承Thread类和实现Runnable接口来创建线程
- Java多线程基础-2-简单继承Thread,实现Runnable例子
- Java 继承Thread和实现Runnable实现多线程的区别
- 【Java并发编程】Runnable和Thread实现多线程的区别
- java 继承Thread和实现Runnable的区别
- shell技巧之快速切换目录z命令
- 《将博客搬至CSDN》
- Lua提供高级的require函数来加载运行库。粗略的说require和dofile完成同样的功能但有两点不同
- mybatis小tips
- 容易_56_两数之和(1)
- Java并发控制基础篇 Thread继承类和Runnable实现类
- 在JS中什么是DOM,DOM的节点有哪些
- Linux进程存储管理
- C++排序算法之冒泡算法
- Laravel框架报错处理
- 创造你的数字货币(3)--发布UNIX安装程序
- 文件操作工具类
- 批量新增数据
- JS正则表达式