博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中Runnable和Thread区别
阅读量:7061 次
发布时间:2019-06-28

本文共 2836 字,大约阅读时间需要 9 分钟。

hot3.png

到处都是这个买票案例介绍,做个笔记。

 

java中有两种实现多线程的方式: 

1. 一种是通过继承Thread类,同时重写run()方法。但是java中,只允许单继承,也就是一个类只能继承一个父类,使得该方式具有一定的局限性,等下就知道了。 
2. 另一种是实现Runnable类接口的run()方法,再结合Thread类来实现多线程。

两种方式最终都是通过调用start()方法来实现多线程。切记不能直接调用Thread类或Runnable对象的run()方法,因为直接调用run()方法,只会执行同一个线程中的任务,而不会启动新线程。调用start()方法将会创建一个执行run()方法的线程。下面讲几个例子来辅助理解:

例1:继承Thread类,调用run()方法

package com.x.test;public class MyThread extends Thread {	private String name;    private int ticket = 5;        public MyThread(String name) {        this.name = name;    }        public void run() {        for (int i=0; i<10; i++) {            if (this.ticket>0)                System.out.println("线程开始:"+this.name+",卖票:i="+this.ticket--);        }    }    }

 测试类:

package com.x.test;public class TestThreadRunnable {	public static void main(String[] args) {		Thread t1 = new MyThread("线程a");        Thread t2 = new MyThread("线程b");          t1.run();        t2.run();	}}

运行结果:

线程开始:线程a,卖票:i=5线程开始:线程a,卖票:i=4线程开始:线程a,卖票:i=3线程开始:线程a,卖票:i=2线程开始:线程a,卖票:i=1线程开始:线程b,卖票:i=5线程开始:线程b,卖票:i=4线程开始:线程b,卖票:i=3线程开始:线程b,卖票:i=2线程开始:线程b,卖票:i=1

结果分析:

看看运行结果,先执行第一个对象的run(),然后执行第二个对象的run(),并没有启动新线程。

例2:继承Thread类,调用start()方法

package com.x.test;public class TestThreadRunnable {	public static void main(String[] args) {				Thread t1 = new MyThread("线程a");        Thread t2 = new MyThread("线程b");                        t1.start();        t2.start();       	}}

运行结果:

线程开始:线程a,卖票:i=5线程开始:线程b,卖票:i=5线程开始:线程a,卖票:i=4线程开始:线程b,卖票:i=4线程开始:线程a,卖票:i=3线程开始:线程b,卖票:i=3线程开始:线程a,卖票:i=2线程开始:线程b,卖票:i=2线程开始:线程a,卖票:i=1线程开始:线程b,卖票:i=1

结果分析: 

1. 看看运行结果,两个线程正常完成交互运行。说明start()方法是新建了一个线程去执行run()方法。 
2. 两个线程访问的run()方法都是独立的,对应的MyThread类成员变量ticket也是独立。资源不能共享

例3:实现Runnable接口

package com.x.test;public class MyRunnable implements Runnable {	private int ticket = 5;    @Override    public void run() {        // TODO Auto-generated method stub        for (int i=0; i<10; i++) {            if (this.ticket>0)                System.out.println("线程开始:"+Thread.currentThread().getName()+",卖票:"+this.ticket--);        }    }}

 测试类:

package com.x.test;public class TestThreadRunnable {	public static void main(String[] args) {		        Runnable r = new MyRunnable();        Thread t1 = new Thread(r, "线程a");        Thread t2 = new Thread(r, "线程b");        t1.start();        t2.start();        	}}

运行结果:

线程开始:线程a,卖票:4线程开始:线程b,卖票:5线程开始:线程a,卖票:3线程开始:线程b,卖票:2线程开始:线程a,卖票:1

结果分析:

1. 使用Runnable对象时,Runnable定义的子类没有start()方法,只有Thread类中才有,观察Thread类,有一个构造方法public Thread(Runnable target),此构造方法接受Runanble的子类实例,也就是说可以通过Thread类来启动Runnable实现多线程。 

2. 每个线程调用的都是同一个MyRunnable对象的run()方法,访问的是同一个对象中的变量ticket实例。

 

Runnable和Thread区别

实际开发中我们通常采用Runnable接口来实现多线程。因为实现Runnable接口比继承Thread类有如下好处: 

1. 避免继承的局限,一个类可以继承多个接口,但是类只能继承一个类。 
2. Runnable接口实现的线程便于资源共享。而通过Thread类实现,各自线程的资源是独立的,不方便共享。上面例2可以看出线程a跟线程b各卖了5张票,而例子3两个线程共卖了5张票,而且没有重复

转载于:https://my.oschina.net/lenglingx/blog/1538586

你可能感兴趣的文章
python beautifulsoup爬虫
查看>>
Centos6.x X64 飞信安装
查看>>
python Docker 查看私有仓库镜像
查看>>
mysql主从
查看>>
x2engine
查看>>
1084 矩阵取数问题 V2
查看>>
图片头代码
查看>>
Django 项目创建方法
查看>>
动态原型
查看>>
简单字符串处理 hdu2532 Engine
查看>>
robots协议
查看>>
Jquery
查看>>
flask开发没有解决的bug记录
查看>>
在Debian-7.1下安装Bumblebee解决双显卡发热问题
查看>>
.net创建Windows应用程序基本文件介绍
查看>>
一个SQLSERVER触发器的示例
查看>>
Online tools
查看>>
驻扎博客园,以后每天都有进步
查看>>
Python面向对象-访问权限public和private
查看>>
tensorflow1
查看>>