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

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

!!!!!!Thread和Runnable都是可以实现资源共享的!!!!只要把资源作为参数传递给进程Thread的构造函数就行,因为这样start()方法调用的就是g1.run()Goods g1 = new Goods("鸡翅盒饭",100);Thread t1 = new Thread(g1,"小明");

既然都可以那么为什么要有Runnable?

因为类只能继承一个父类,继承了Thread就没法继承别的类了,,  有了Runnable接口就可以继承别的类了,增强了程序的拓展性 我的理解是这样的 我们之所以要继承Thread是因为在调用线程对象的start()方法开启线程时, start()会自动将Thread中的 run()作为执行代码,因此我们必须用我们实际想要执行的代码来覆盖run()方法,而覆盖就必须继承 Thread,,,又因为继承Thread有缺点,所以为了不覆盖,,可以在创建线程对象时将包含run方法的资源对象 作为Thread构造器参数target(使用Runnable时必须把资源对象作为参数传给Thread构造器,不然没用)

  public void run() {

    if (target != null) {
      target.run();
    }
  }

这是Thread中run()方法的源码,可以看出有了参数(资源对象)后,直接执行target即资源对象中的run,,

Runnable接口只是为了规范方法名run(),对执行哪个run这个过程没有影响,,不写的话会报错

The constructor Thread(Goods, String) is undefined*(不知道报错的源码在哪,,,,没找到,,)

1继承Thread(3个线程处理一个资源)

1 package noname; 2 class Goods extends Thread { 3     String name ; 4     int num ; 5     Goods(String name, int num) { 6         this.name = name; 7         this.num = num; 8     } 9     void eat() {10         while(num>0){11             System.out.println(name+"   "+num--+",,,"+Thread.currentThread().getName()+"吃的");12         }13     }14     public void run() {15         eat();    16     }17     18 }19 class Productor{20     21 }22 class Consumer{23     24 }25 public class Test {26     public static void main(String[] args) {27         Goods g1 = new Goods("鸡翅盒饭",100);28         Thread t1 = new Thread(g1,"小明");29         Thread t2 = new Thread(g1,"小红");30         Thread t3 = new Thread(g1,"小黄");31         t1.start();32         t2.start();33         t3.start();34     }35     36 }

 2实现Runnable接口

1 package noname; 2 class Goods implements Runnable { 3     String name ; 4     int num ; 5     Goods(String name, int num) { 6         this.name = name; 7         this.num = num; 8     } 9     void eat() {10         while(num>0){11             System.out.println(name+"   "+num--+",,,"+Thread.currentThread().getName()+"吃的");12         }13     }14     public void run() {15         eat();    16     }17     18 }19 class Productor{20     21 }22 class Consumer{23     24 }25 public class Test {26     public static void main(String[] args) {27         Goods g1 = new Goods("鸡翅盒饭",100);28         Thread t1 = new Thread(g1,"小明");29         Thread t2 = new Thread(g1,"小红");30         Thread t3 = new Thread(g1,"小黄");31         t1.start();32         t2.start();33         t3.start();34     }35     36 }

这里可以看出   我只是把extends Thread改为了implements Runnable  并且结果没有变化

 

转载于:https://www.cnblogs.com/daboluo123/p/7763801.html

你可能感兴趣的文章
[十二]JavaIO之BufferedInputStream BufferedOutputStream
查看>>
java泛型中特殊符号的含义
查看>>
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
linuxan安装redis出现Newer version of jemalloc required错误
查看>>
在centos7下用http搭建配置svn服务
查看>>
PHP APP端支付宝支付
查看>>
TCP长连接的一些事儿
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
Hibernate懒加载/延迟加载机制总结
查看>>
fail2ban安装与使用
查看>>
拦截器(Interceptor)中的invocation.invoke()是什么意思?
查看>>
metasploit扫描MySQL用户名和密码
查看>>
walle上线部署系统
查看>>
java日志框架
查看>>
使用mysql备份工具innobackupex将本地数据 直接恢复 到远端服务器数据目录操作实例...
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>
Quick Tip: Configure Static IP in Centos 6.5
查看>>
Word 2003中编辑标记与格式标记大讨论
查看>>
sed 使用方法
查看>>