上一讲中我们提到了继承Thread类是实现多线程的一种方式,那么现在就来看看第二种方式:Runnable接口。
废话少说,上代码(依旧是之前的例子):
public class ThreadDemoOne implements Runnable { int no,workno,sleeptime; public ThreadDemoOne(int no,int workno,int sleeptime) { // TODO Auto-generated constructor stub this.no = no; this.workno = workno; this.sleeptime = sleeptime; } @Override public void run() { // TODO Auto-generated method stub try { for(int i=0;i<5;i++){ System.out.println("Thread["+no+"] do work "+workno+"_"+i); Thread.sleep(1000); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { System.out.println("Main do work 1"); new Thread(new ThreadDemoOne(1,2,1000)).start(); System.out.println("Main do work 3"); Thread.sleep(1000); System.out.println("Main do work 4"); new Thread(new ThreadDemoOne(2,5,1000)).start(); Thread.sleep(1000); System.out.println("Main do work 6"); } }
乍一看貌似一样啊,请仔细看(红色代码部分),是的,区别就是这么小!
有人就有疑问了,oracle是不是吃饱了撑的(sorry,骂错了,当时还是SUN公司推出的多线程),为什么好端端要提供两种差不多的多线程实现方式呢?
不着急骂Java脑残,我们先来看看两者的关系:
首先,我们发现Thread是个类,而Runnable是接口,但凡计算机科班出身,或者参加过java面试的同学,都能轻而易举的说出类和接口的联系和区别,其中最重要的一点就是,类无法多重继承,而接口可以实现多个。好了,这就是Thread和Runnable的区别之一。
其次,我们发现Runnable接口方法中没有start()方法,而多线程激活需要这个方法,但这个方法存在于Thread类中。也就是可以说,对于实现Runnable接口的子类,也需要依靠Thread的start()方法来启动多线程。
最后,通过JDK文档,我们发现Thread类实现Runnable接口,即在本质上,Thread类是Runnable接口的子类。
了解了以上几点,相信大家都明白了Thread离不开Runnable,因为Runnable是他老子,而实现Runnable接口的子类也离不开Thread,因为要靠Thread来启动多线程,环环相扣,惺惺相惜,可昭日月~~
看完上面这段刻骨铭心的互相依赖关系,我们还是要写个观后感:建议读书者尽可能的使用Runnable接口去实现多线程机制,这样既可以避免了类的单继承局限,也可以使方法和启动解耦,而且也适合于资源共享!
等等,资源共享?上面没提到这个啊,这到底怎么回事?
对了,忘记说了,哈哈!我们还是来看代码吧,来个经典的12307-1关注的卖票问题,目前手头就五张票,要三个窗口一起卖,分别采用Thread和Runnable的方式:
public class SellTicket extends Thread { private int ticket = 5;//实际只有五张票 @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<100;i++){ if(ticket>0){ System.out.println(Thread.currentThread().getName()+" sell ticket["+ticket--+"]"); } } } public static void main(String[] args) { //实例化了三个卖票对象,实际是各卖各的票,猜猜总共卖出去几张? new SellTicket().start(); new SellTicket().start(); new SellTicket().start(); } }
public class SellTicket implements Runnable { private int ticket = 5;//实际只有五张票 @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<100;i++){ if(ticket>0){ System.out.println(Thread.currentThread().getName()+" sell ticket["+ticket--+"]"); } } } public static void main(String[] args) { //只实例化了一个卖票对象,实际是三个线程一起卖票,猜猜总共卖出去几张? SellTicket st = new SellTicket(); new Thread(st).start(); new Thread(st).start(); new Thread(st).start(); } }
这就是Runnable的共享资源的好处,今天就到这,洗洗睡了~
相关推荐
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java多线程--创建多线程的基本方式二:实现Runnable接口
基于JAVA的多线程实现方法-实现Runnable接口 将需要实现多线程的类声明为实现Runnable接口的类,实现run()方法,并将线程体放在该方法里。
计算机后端-Java-Java核心基础-第20章 多线程 09. 同步方法处理实现Runnable的线程安全
java多线程runnable实例,经过测试的,可以直接运行
计算机后端-Java-Java核心基础-第20章 多线程 07. 同步代码块处理实现Runnable的线程安全问题.avi
主要介绍了java 多线程Thread与runnable的区别的相关资料,java线程有两种方法继承thread类与实现runnable接口,下面就提供实例帮助大家理解,需要的朋友可以参考下
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...
java多线程机制: 例子 1 public class Example1 { static Lefthand left;static Righthand right; public static void main(String args[]) { left=new Lefthand(); //创建两个线程。 right=new Righthand();...
1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。...
1、Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。 2、多线程是并发执行的,交替占有cpu执行,请编写示例程序,并观察输出结果。 3、采用线程同步方法...
Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...
一个简单的多线程代码示例,Java实现,用于实现同一时刻,只允许一个线程调用执行的代码块或类,即synchronized的如何使用(多线程实现),实现 Runnable
关于java多线程技术的实验 掌握java语言中的多线程编程技巧 掌握Thread类和Runnable接口 掌握java语言中多线程的生命周期 掌握java语言中线程的通信技巧
本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口
Java多线程技术允许程序同时执行多个线程,每个线程执行一个独立的任务。这种并发性能够提高程序的性能和资源利用率,使得程序能够同时处理多个任务,从而提高响应速度和吞吐量。 在Java中,实现多线程有几种方式:...
单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
本资源包“Java多线程与线程安全实践-基于Http协议的断点续传....通过这个实践项目,学生不仅能够加深对Java多线程和线程安全概念的理解,还能提升解决实际问题的能力,为未来的软件开发工作打下坚实的基础。重新回答||
Runnable 接口只有一个方法 run(),我们声明自己的类实现 Runnable 接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是 Runnable 接口并没有任何对线程的支持,我们还必须创建 Thread ...