Java的start()和run()方法的区别与联系

Java 专栏收录该内容
15 篇文章 0 订阅

首先我们来说一说Runnable接口和Thread类,因为start()涉及到了多线程并发,所有我们来看看开启多线程的两个方法

在实现单任务时通常用Runnable接口,多任务时一般用Thread类 ,Thread与Runnable是继承关系,Thread继承了Runnable的接口,可以使用更多的方法和成员。

实现并启动线程有两种方法
1、写一个类继承自Thread类,重写run方法。用start方法启动线程
2、写一个类实现Runnable接口,实现run方法。用new Thread(Runnable target).start()方法来启动

1.继承Thread类

/**
 * @(#)TestThre.java
 *
 *
 * @author 
 * @version 1.00 2020/5/10
 */


public class TestThre {
	public static void main(String[] args){
		new MyThread().start();
		new MyThread().start();
	}

    static class MyThread extends Thread{
    	private int tickets = 5;
    	public void run(){
    		while(true){
    			System.out.println("Thread ticket = "+tickets--);
    			if(tickets<0){
    				break;
    			}
    		}
    	}
    }
}

运行结果:

 

改进后的代码,在this指针上加了一个synchronized锁,实现了线程同步。

/**
 * @(#)NewThre.java
 *
 *
 * @author 
 * @version 1.00 2020/5/10
 */


public class NewThre extends Thread {
	private int tickets = 5;
	public void run(){
		for(int i=0;i<5;i++){
			synchronized(this){
				if(this.tickets>0){
					try{
						Thread.sleep(10);
						System.out.println(Thread.currentThread().getName()+"卖票--->"+(this.tickets--));
					}
					catch (InterruptedException e){
						e.printStackTrace();
					}
				}
			}
		}
	}
	public static void main(String[] args){
		NewThre t3 = new NewThre();
		new Thread(t3,"线程一").start();
		new Thread(t3,"线程二").start();
		
	}
    
    
}

运行结果:

 

 

 2. 实现Runnable接口

/**
 * @(#)RunnableTest.java
 *
 *
 * @author 
 * @version 1.00 2020/5/10
 */


public class RunnableTest {
	public static void main(String[] args){
		myThread dt = new myThread();
		new Thread(dt).start();
		new Thread(dt).start();
	}

   static class myThread implements Runnable{
   	private int tickets = 5;
   	public void run(){
   		while(true){
   			System.out.println("Runnable ticket = "+tickets--);
   			if(tickets<0){
   				break;
   			}
   		}
   	}
   	
   }
    
    
}

运行结果:

 

其次,再来谈谈start()和run()方法

 start()方法用来开启线程,在开启线程后自动调用run()方法

  • 调用start()方法后会创建一个线程,此时的线程处于就绪状态,并放到等待队列,等待CPU执行,通过JVM,线程Thread会调用run()方法,run()f方法体包含所要执行的代码,在run()方法运行结束以后,CPU开始调度其它线程。在start()方法开启一个线程后,并不需要等待后面的run()方法执行,可以直接执行后面的代码。
  •  run()方法用来运行线程,run()方法当做普通方法的方式调用,程序顺序执行,等待run()方法执行完毕以后,才能继续执行下面的代码。这是在没有开启多线程的情况下,程序中只有一个主线程。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
程序员必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA必备技能,甚至部分IT开发岗位也要求对数据库使用原理有深入了解掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺技能!   套餐中一共包含2门MySQL数据库必学核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识人;  2)对MySQL掌握程度薄弱人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底问题问到怀疑人生应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL最佳性能优化方法,掌握如何处理海量业务数据高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料打包下载。
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值