Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

简介:

一. java中实现线程的方式有Thread和Runnable

Thread:

1
2
3
4
5
6
public  class  Thread1  extends  Thread{
     @Override
     public  void  run() {
         System.out.println( "extend thread" );
     }
}

 Runnable:

1
2
3
4
5
6
7
8
public  class  ThreadRunable  implements  Runnable{
 
     public  void  run() {
         System.out.println( "runbale interfance" );
         
     }
     
}

 使用

1
2
3
4
public  static  void  main(String[] args) {
         new  Thread1().start();
         new  Thread( new  ThreadRunable()).start();
     }

  

 

二.Thread和Runnable区别

 1.在程序开发中使用多线程实现Runnable接口为主。 Runnable避免继承的局限,一个类可以继承多个接口

 2. 适合于资源的共享

   如下面的例子   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  TicketThread  extends  Thread{
     
     private  int  ticketnum =  10 ;
     
     @Override
     public  void  run() {
         for ( int  i= 0 ; i< 20 ;i++){
             if  ( this .ticketnum >  0 ) {
                 ticketnum--;
                 System.out.println( "总共10张,卖掉1张,剩余"  + ticketnum);
             }
         }
     }
}

  使用三个线程

1
2
3
4
5
6
7
8
public  static  void  main(String[] args) {
         TicketThread tt1 =  new  TicketThread();
         TicketThread tt2 =  new  TicketThread();
         TicketThread tt3 =  new  TicketThread();
         tt1.start();
         tt2.start();
         tt3.start();
     }

  实际上是卖掉了30张车票

而使用Runnable,如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  TicketRunnableThread  implements  Runnable{
 
private  int  ticketnum =  10 ;
     
     public  void  run() {
         for ( int  i= 0 ; i< 20 ;i++){
             if  ( this .ticketnum >  0 ) {
                 ticketnum--;
                 System.out.println( "总共10张,卖掉1张,剩余"  + ticketnum);
             }
         }
     }
}

  使用三个线程调用

1
2
3
4
5
6
public  static  void  main(String[] args) {
         TicketRunnableThread trt1 =  new  TicketRunnableThread();
         new  Thread(trt1).start();
         new  Thread(trt1).start();
         new  Thread(trt1).start();
     }

  因为TicketRunnableThread是New了一次,使用的是同一个TicketRunnableThread,可以达到资源的共享。最终只卖出10张车票。

 

3.效率对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  static  void  main(String[] args) {
     
          long  l1 = System.currentTimeMillis();
 
             for ( int  i =  0 ;i< 100000 ;i++){
                 Thread t =  new  Thread();
             }
 
             long  l2 = System.currentTimeMillis();
 
             for ( int  i =  0 ;i< 100000 ;i++){
                 Runnable r =  new  Runnable() {
                     public  void  run() {
                     }
                 };
             }
 
             long  l3 = System.currentTimeMillis();
 
             System.out.println(l2 -l1);
             System.out.println(l3 -l2);
     }

  在PC上的结果

1
2
119
5

  所以在使用Java线程池的时候,可以节约很多的创建时间

 



本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/6237218.html,如需转载请自行联系原作者

目录
相关文章
|
16天前
|
Java
在Java中Executor和Executors的区别?
·Executor是一个接口,定义了提交任务的方法。它只关注如何执行任务,不涉及线程池的创建和管理。   ·Executors是一个实用类,提供了创建和管理线程池的方法。它隐藏了一些线程池的细节,使得创建线程池变得更加方便。但是,它的一些默认线程池配置可能不适用于所有场景,特别是在处理大量任务时,可能需要更仔细地配置线程池参数以避免处理网资源耗尽或性能问题。   总之,Executor接口定义了执行任务的基本机制,而Executors类提供了一些预定义的线程池实例来简化线程池的创建和使用。在使用线程池时,根据实际情况,我们可以选择直接实现Executor接口来自定义执行策略,或者使用Execu
|
21天前
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
119 10
|
16天前
|
Java
Java中死锁与活锁的区别,死锁与饥饿的区别?
活锁是另一种并发问题,其中线程不断地改变自己的状态,以躲避其他线程,但最终无法取得进展。在活锁中,线程没有被阻塞,但它们却不能完成工作。活锁通常发生在线程试图避免死锁时。活锁的特点包括:   ·线程不断地改变自己的状态以避免其他线程,但最终无法取得进展。   ·线程仍在运行,但它们没有完成任务。   解决活锁问题通常需要引入随机性,例如在等待时引入短暂的休眠,以帮助线程更好地协调。
|
16天前
|
缓存 Java Android开发
|
1月前
|
Java
Java 中 Exception 和 Error 的区别
在 Java 中,`Exception` 和 `Error` 都是 `Throwable` 的子类,用于表示程序运行时的异常情况。`Exception` 表示可被捕获和处理的异常,分为受检异常(Checked)和非受检异常(Unchecked),通常用于程序级别的错误处理。而 `Error` 表示严重的系统级问题,如内存不足或 JVM 错误,一般不建议捕获和处理。编写程序时应重点关注 `Exception` 的处理,确保程序稳定性。
|
2月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
107 0
|
23天前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
62 0
|
4月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
84 26
|
4月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
91 17
|
6月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
496 2