鱼C论坛

 找回密码
 立即注册
查看: 2605|回复: 0

[学习笔记] Java 笔记 多线程 (三)-- Runable接口

[复制链接]
发表于 2017-8-17 16:00:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 可爱的静静 于 2017-8-18 00:26 编辑

多线程 Runable接口
创建线程有两种方式:
1.      继承Thread类并覆盖run方法
2.      实现接口Runnable

第二种方式是(实现Runnable接口)
实现接口步骤:
1.        定义类实现接口
2.        覆盖Runnable 接口中的run方法(也是把创建好的线程想要执行的代码放在run)
3.        通过Thread类创建线程对象
4.        将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法
      实现Runnable接口的子类对象传递给Thread类的结构方法,让Thread类去执行指定对象的run方法
         这个结构方法是
Thread(Runnable target)
                 分配新的 Thread 对象。
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run 方法
//定义类实现接口并且覆盖run方法
例子:售票系统
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.         public static void main(String[] args) {
  5.                          Ticket  t=new Ticket();
  6.                          Thread a=new Thread();
  7.                         a.        start();
  8.                          Thread b=new Thread(t);
  9.                         b.        start();
  10.                         Thread c=new Thread(t);
  11.                         c.        start();
  12.                         }
  13.         }

  14. class Ticket implements Runnable//实现接口 原来的方法是class Ticket extends Thread
  15. {
  16.    private int ticket=100;
  17.    public void run(){
  18.    while(true){
  19. if(ticket>0)
  20. System.out.println(Thread.currentThread().getName()+"…sale:"+ticket--);
  21. }
  22.    }
  23. }
复制代码


Thread a=new Thread(); a.start () 这个只是启动了Thread的run方法是:
void        run()
          如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

所以没有输出什么

因为Thread类有个结构方法:
Thread(Runnable target)
                 分配新的 Thread 对象。

所以可以把 实现Runnable接口的子类对象传递给Thread类的结构方法,让Thread类去执行指定对象的run方法


如果是方法一继承Thread这个方法的话代码是这样的
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.         public static void main(String[] args) {
  5.                          Ticket  a=new Ticket();
  6.                         a.        start();
  7.                          Ticket b=new Ticket();
  8.                         b.        start();
  9.                         
  10.                         }
  11.         }

  12. class Ticket  extends Thread
  13. {
  14.    private int ticket=100;
  15.    public void run(){
  16.    while(true){
  17. if(ticket>0)
  18. System.out.println(Thread.currentThread().getName()+"…sale:"+ticket--);
  19. }
  20.    }
  21. }

复制代码


方法一和方法二的区别:
1.        实现方式是可以实现接口还可以继承其他类,但是继承Thread就不能继承其他类
避免了单继承的局限性,多数用实现Runnable
例如:看图1和图二   hahahah

2.        存放方式不同
用Thread 实现的代码存放在 Thread类的子类run方法中
实现Runnable实现的代码存放在 Runnable 接口的子类方法中

Thread类其实也实现了Runnable接口 就业是为了确定把实现代码存在run方法中

上面的两个代码都是买票系统,然后输出卖到第几张,两个代码执行后 不同的是同样式售票的 而且初始值都是100 但是结果是
实现Runnable 即使是开启多条线程一起卖票的,但只卖出100
继承Thread 方式的是 多条线程一起卖 ,卖出的票一共是200
因为 实现Runnable方法只传了一个对象t 继承Thread只有两个对象,两个对象都有ticket=100

1.png
2.png

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表