java线程之基础学习
java线程之基础学习总结
线程实现的两种方式:
在java中可以有两种方式实现多线程操作,一种是继承Thread类,另外一种是实现Runnable接口。
继承Thread类
Thread类是在java.lang包中定义的
一个类只要继承Thread类,要覆写run()方法。
简单实例
定义MyThread类
- 定义MyThread类
- public class MyThread extends Thread {
- private String name;
- public MyThread(String name) {
- this.name = name;
- }
- public void run() {
- for (int i = 0; i < 5; i++) {
- System.out.println(name + "运行:" + i);
- }
- }
- }
编写TestThread类调用:
- public class TestThread {
- public static void main(String[] args) {
- MyThread myThread1 = new MyThread("singsong1");
- MyThread myThread2 = new MyThread("singsong2");
- myThread1.run();
- myThread2.run();
- }
- }
- 运行结果:
- singsong1运行:0
- singsong1运行:1
- singsong1运行:2
- singsong1运行:3
- singsong1运行:4
- singsong2运行:0
- singsong2运行:1
- singsong2运行:2
- singsong2运行:3
- singsong2运行:4
从结果可以发现,此时的执行非常的有规律,先执行完第一个对象,再执行第二个对象。
把run()方法换成start();一旦调用start()方法,则会通过JVM找到run()方法
Public void start()
使用start()方法启动线程:
- public class TestThread {
- public static void main(String[] args) {
- MyThread myThread1 = new MyThread("singsong1");
- MyThread myThread2 = new MyThread("singsong2");
- myThread1.start();
- myThread2.start();
- }
- }
- 运行结果:
- singsong1运行:0
- singsong1运行:1
- singsong2运行:0
- singsong1运行:2
- singsong2运行:1
- singsong1运行:3
- singsong2运行:2
- singsong1运行:4
- singsong2运行:3
- singsong2运行:4
从运行结果可以知道,程序时交互式的运行。
因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的
不要调用Thread类或Runnable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start()方法。这个方法将创建一个执行run方法的新线程。
Runnable接口的实现
简单实例
- public class RunnableThread implements Runnable {
- private String name;
- public RunnableThread(String name) {
- this.name = name;
- }
- public void run() {
- for (int i = 0; i < 5; i++) {
- System.out.println(name + "运行:" + i);
- }
- }
- }
编写TestThread1调用
- public class TestThread1 {
- public static void main(String[] args) {
- RunnableThread runnableThread1=new RunnableThread("singsong1");
- RunnableThread runnableThread2=new RunnableThread("singsong2");
- Thread thread1= new Thread(runnableThread1);
- Thread thread2= new Thread(runnableThread2);
- thread1.start();
- thread2.start();
- }
- }
- 运行结果:
- singsong1运行:0
- singsong1运行:1
- singsong2运行:0
- singsong2运行:1
- singsong2运行:2
- singsong2运行:3
- singsong2运行:4
- singsong1运行:2
- singsong1运行:3
- singsong1运行:4
Thread类和Runnable接口区别
最大区别是在于资源的共享
如果一个类继承Thread,则资源共享不可共享。而实现Runable接口,能实现资源共享。
例如:
MyThread类
- public class MyThread extends Thread {
- private int ticket = 5;
- private String name;
- public MyThread(String name) {
- this.name = name;
- }
- public void run() {
- for (int i = 0; i < 15; i++) {
- if (ticket > 0) {
- System.out.println(name + "正售出第 " + (ticket--) + "票");
- }
- }
- }
- }
- 调用:
- public class TestThread {
- public static void main(String[] args) {
- MyThread myThread1 = new MyThread("singsong1");
- MyThread myThread2 = new MyThread("singsong2");
- myThread1.start();
- myThread2.start();
- }
- }
- 运行结果:
- singsong1正售出第 5票
- singsong1正售出第 4票
- singsong1正售出第 3票
- singsong1正售出第 2票
- singsong1正售出第 1票
- singsong2正售出第 5票
- singsong2正售出第 4票
- singsong2正售出第 3票
- singsong2正售出第 2票
- singsong2正售出第 1票
重复售出了一次
再来看看Runnable接口是怎么实现资源共享的
RunnableThread类
- public class RunnableThread implements Runnable {
- private int ticket = 5;
- private String name;
- public RunnableThread(String name) {
- this.name = name;
- }
- public void run() {
- for (int i = 10; i > 0; i--) {
- if (ticket > 0) {
- System.out.println(name + "正售出第 " + (ticket--) + "票");
- }
- }
- }
- }
编写TestThread1类调用:
- public class TestThread1 {
- public static void main(String[] args) {
- RunnableThread runnableThread1 = new RunnableThread("singsong1");
- Thread thread1 = new Thread(runnableThread1);
- Thread thread2 = new Thread(runnableThread1);
- thread1.start();
- thread2.start();
- }
- }
- 运行结果:
- singsong1正售出第 5票
- singsong1正售出第 4票
- singsong1正售出第 3票
- singsong1正售出第 2票
- singsong1正售出第 1票
从运行结果可以得出实现Runnable接口的优点。
大家有没有想过Runnable接口为什么能实现资源的共享,而Thread类不能
本人个人理解
首先看如下代码:
- public class TestThread1 {
- public static void main(String[] args) {
- RunnableThread runnableThread1 = new RunnableThread("singsong1");
- RunnableThread runnableThread2 = new RunnableThread("singsong2");
- Thread thread1 = new Thread(runnableThread1);
- Thread thread2 = new Thread(runnableThread2);
- thread1.start();
- thread2.start();
- }
- }
此代码是在TestThread1类的继承上修改的:添加了 RunnableThread runnableThread2 = new RunnableThread("singsong2");
把runnableThread1换成runnableThread2
现在我们在运行程序看看结果:
- singsong1正售出第 5票
- singsong1正售出第 4票
- singsong1正售出第 3票
- singsong1正售出第 2票
- singsong1正售出第 1票
- singsong2正售出第 5票
- singsong2正售出第 4票
- singsong2正售出第 3票
- singsong2正售出第 2票
- singsong2正售出第 1票
从结果可以知道也重复了一次。
总结一下:也是就说Runnable接口能实现资源的共享是因为用同一个实现Runnable接口的子类来创建不同的线程,去执行同一个任务。而Thread却没有这种机制。
转载于:https://blog.51cto.com/singsong/1163248
java线程之基础学习相关推荐
- 【韩顺平】Java线程(基础)知识点总结
文章目录 1.线程概念 1.1程序 1.2进程 1.3线程 2.其他相关概念 2.1并发 2.2并行 2.3单线程 2.4多线程 3.创建线程的两种方法 3.1继承Thread类,重写run方法 3. ...
- java线程runnable_java基础----多线程之Runnable(一)
java线程的创建有两种方式,这里我们通过简单的实例来学习一下.一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活. java中多线程的创建 一.通过继承Thread类来创建多线程 pu ...
- java培训 | 零基础学习java开发的学习方法有哪些
随着IT行业的不断发展,java根据自身的优势,得到大中小企业的青睐,由此可见java开发的应用市场不断扩大.有许多小伙伴进军java开发行业,那零基础学习java开发的学习方法有哪些? 无论是学习什 ...
- java三板斧_JAVA基础学习 三板斧
JAVA基础学习 -1 三板斧 1. 引子 最近因为工作需要,开始学习JAVA,我之前常用的编程语言是C,C#,C++,基本没有用JAVA,JAVA需要从基础开始学习了. JAVA是从C++优化而来: ...
- Java小白零基础学习如何突破自己的方法
有很多Java程序员在学习之初经常对如何学习感到困惑.本文将分析如何学习Java编程,并相信它可以帮助处于混乱状态的初学者. I.培养兴趣 兴趣是可以让你继续前进的动力.如果你只是把这个程序写成谋生手 ...
- 零基础是学java还是python-零基础学习编程,Java、Python你会选择哪个?
现在很多零基础的小伙伴都想要进入到编程行业之中,无论什么情况选择哪门语言都非常重要,毕竟关系到以后的发展和薪资,很多人都知道Python是当下很火的语言,也知道Java是非常高级的编程语言,问题来了, ...
- 【Java】零基础学习Java需要多久?
其实学java一般要多久?因人而异,例如一个零基础的小白自学java,每天学习8个小时来算,而且在有学习资料的基础上,每天学习,从零到找到工作,起码要半年起步,而且还要有项目经验,否则是不会有公司要你 ...
- java线程wait_java多线程学习(四) 之 wait和notify
ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...
- 无基础怎么学习java虚拟机,0基础学习Java ——Java 虚拟机结构(上)
马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 回忆一遥远 于 2017-8-16 07:35 编辑 Class 文件格式 Java 编 ...
最新文章
- 杭电 hdu 1003
- Android--制作开场动画/MediaPlayer OnCompletionListener
- createrepo常用参数
- Java统计文件夹中文件总行数
- 如何使用Chrome command API查找SAP Spartacus的router-outlet
- ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...
- 串口 多个activity 安卓_一个Activity实时向另一个Activity发送消息
- T4 Templates and the Entity Framework
- 步骤mysql_mysql 安装 等步骤(一)
- 20200308: 生成每种字符都是奇数个的字符串灯泡开关 III(leetcode5352-5353)
- 邮件归档提升信息价值(上)
- 《Android音视频开发》封面由你来投票
- vim个性化设置---给脚本文件加注释头信息
- 专业的PRD撰写模板
- Android保存照片到相册
- java开发入行真功夫pdf_Visual C++开发入行真功夫
- 自然语言处理之文本分类
- 计算机绘图CAD实训指导,【精品】CAD计算机绘图实习指导书
- npm ERR! could not determine executable to run
- Oracle的软解析(soft prase)和硬解析(hard prase)