Java中线程的创建有两种方式
Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式:
1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中
2. 通过实现Runnable接口,实例化Thread类
在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果。
- package com.threadtest;
- class MyThread extends Thread{
- private int ticket = 10;
- private String name;
- public MyThread(String name){
- this.name =name;
- }
- public void run(){
- for(int i =0;i<500;i++){
- if(this.ticket>0){
- System.out.println(this.name+"卖票---->"+(this.ticket--));
- }
- }
- }
- }
- public class ThreadDemo {
- public static void main(String[] args) {
- MyThread mt1= new MyThread("一号窗口");
- MyThread mt2= new MyThread("二号窗口");
- MyThread mt3= new MyThread("三号窗口");
- mt1.start();
- mt2.start();
- mt3.start();
- }
- }
运行结果如下:
- 一号窗口卖票---->10
- 一号窗口卖票---->9
- 二号窗口卖票---->10
- 一号窗口卖票---->8
- 一号窗口卖票---->7
- 一号窗口卖票---->6
- 三号窗口卖票---->10
- 一号窗口卖票---->5
- 一号窗口卖票---->4
- 一号窗口卖票---->3
- 一号窗口卖票---->2
- 一号窗口卖票---->1
- 二号窗口卖票---->9
- 二号窗口卖票---->8
- 三号窗口卖票---->9
- 三号窗口卖票---->8
- 三号窗口卖票---->7
- 三号窗口卖票---->6
- 三号窗口卖票---->5
- 三号窗口卖票---->4
- 三号窗口卖票---->3
- 三号窗口卖票---->2
- 三号窗口卖票---->1
- 二号窗口卖票---->7
- 二号窗口卖票---->6
- 二号窗口卖票---->5
- 二号窗口卖票---->4
- 二号窗口卖票---->3
- 二号窗口卖票---->2
- 二号窗口卖票---->1
通过实现Runnable接口的代码如下:
- package com.threadtest;
- class MyThread1 implements Runnable{
- private int ticket =10;
- private String name;
- public void run(){
- for(int i =0;i<500;i++){
- if(this.ticket>0){
- System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
- }
- }
- }
- }
- public class RunnableDemo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- //设计三个线程
- MyThread1 mt = new MyThread1();
- Thread t1 = new Thread(mt,"一号窗口");
- Thread t2 = new Thread(mt,"二号窗口");
- Thread t3 = new Thread(mt,"三号窗口");
- // MyThread1 mt2 = new MyThread1();
- // MyThread1 mt3 = new MyThread1();
- t1.start();
- t2.start();
- t3.start();
- }
- }
运行结果如下:
- 一号窗口卖票---->10
- 三号窗口卖票---->9
- 三号窗口卖票---->7
- 三号窗口卖票---->5
- 三号窗口卖票---->4
- 三号窗口卖票---->3
- 三号窗口卖票---->2
- 三号窗口卖票---->1
- 一号窗口卖票---->8
- 二号窗口卖票---->6
为什么会出现这种结果呐。我们不妨做个比喻,其实刚的程序,
继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗口,他们各做各的事各卖各的票各完成各的任务,因为MyThread继承Thread类,所以在new MyThread的时候在创建三个对象的同时创建了三个线程;
实现Runnable的, 相当于是拿出一个卖票10张得任务给三个人去共同完成,new MyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。
用图表示如下:
在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了。
大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。
转载于:https://www.cnblogs.com/hyhong/p/5201244.html
Java中线程的创建有两种方式相关推荐
- Java中类加载器获取的两种方式
import org.junit.Test;import java.io.FileInputStream; import java.io.IOException; import java.io.Inp ...
- java中关于递增和递减两种方式的差别
一.什么是递增和递减? 递增操作符:"++" 理解意思:每次增加一个单位. 递减操作符:"--" 理解意思:每次减少一个单位. 1.前缀式递增和递减(++a或- ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java中的string定义的两种方法和区别
java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
转载自 线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当 ...
- 指针数组下标JAVA_Java语言中可用下标和指针两种方式表示数组元素。
[判断题]一行可以写多条预处理命令 [判断题]如果一个java程序中有多个类,编译后只生成一个字节码文件,其名字同主类名一致. [判断题]Protected类型的实例变量只能在本类中使用,其他类中不可 ...
- java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较
1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...
- html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式
从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...
- TCP中recv解阻塞的两种方式
TCP中recv解阻塞的两种方式 1.收到客户端发送的数据 2.客户端关闭了套接字,可以通过判断收到数据的长度来判断客户端是否下线,长度为0代表已下线. send操作 1.在阻塞模式下send操作将会 ...
最新文章
- Json 学习 JSONObject 和 JSONArray
- merge合并2个json文件
- 【转】【Centos】Centos下用upstart管理自己的服务程序
- 实现后台检控并关闭进程的批处理
- React-Native入门(1)-项目工程初识
- 无限的hypotheses 变成有限的dichotomies
- mysql 自定义函数
- x299服务器芯片组,18核心炸裂!X299主板全集:为它真拼了
- IE9浏览Flash页面时显示错位并不停地闪烁
- html5测试题整理--针对标签的概念性
- SpringBoot中的Tomcat是如何启动的
- [Linux: 编程]如何调试GCC段错误-转
- mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...
- 有一定的php基础,求推荐PHP框架,本人有一定PHP基础。
- 贝叶斯优化核极限学习机KELM用于回归预测
- 前中后序遍历对比记忆
- python 多目标跟踪_多目标追踪器:用 OpenCV 实现多目标追踪(C++/Python)
- 手机刷入其它系统跳过谷歌开机引导,谷歌安全验证
- 阿里玄难:面向不确定性的软件设计几点思考
- python中筛选内容_Python中数据筛选代码实现
热门文章
- 工作的思考十六:层次的提升 - 团队
- Android SDCard UnMounted 流程分析(三)
- 用Python编写干净 可测试 高质量的代码
- 标准RTSP消息的错误代码–转
- Executors 线程池的7个参数详解
- [Python] L1-037. A除以B 团体程序设计天梯赛GPLT
- [swift] LeetCode 695. Max Area of Island
- L1-001. Hello World-PAT团体程序设计天梯赛GPLT
- presentViewController:navigationController animated:YES completion:^(void)
- mysql期中考试题及答案_MySQL数据库考试试题与答案