请选择 进入手机版 | 继续访问电脑版

我爱科技论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 312|回复: 0

[技术分享] 【java进阶】线程创建的两种方式

[复制链接]

696

主题

743

帖子

7686

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7686

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2017-12-20 19:01:10 | 显示全部楼层 |阅读模式

两种线程创建方式的比较

第一种方式:继承Thread类

实现步骤:
1.自定义类继承Thread
2.覆盖Thread中的run()方法
3.创建该类的对象,调用start()方法,开启线程并调用run方法

  1. class MyThread extends Thread{  
  2.     public void run(){  
  3.         for (int i = 0; i < 100; i++){  
  4.             System.out.println("MyThread.run()..."+i);  
  5.         }   /*单条线程运行一百次*/
  6.     }  
  7. }  
  8. public class test1{  
  9.     public static void main (String[] args){  
  10.         MyThread a = new MyThread();  
  11.         a.start();  
  12.         for (int j = 0; j < 100; j++){  
  13.             System.out.println("test1.main()----"+j);  
  14.         }  
  15.     }  
  16. }
复制代码

第二种方式:实现Runnable接口
实现步骤:
1.定义一个实现Runnable接口的类
2.覆盖run方法
3.创建该类对象,并以该类对象为参数创建Thread类的对象,从而创建了一个线程
4.调用start方法,开启线程并调用run方法。

  1. class MyThread implements Runnable{  
  2.     public void run (){  
  3.         for (int i = 0; i < 50; i++){  
  4.             System.out.println("MyThread.run()..."+i);  
  5.         }                       /*每条线程运行50次,共200次*/
  6.     }  
  7. }  
  8. public class test1{  
  9.     public static void main (String[] args){  
  10.         MyThread a = new MyThread();  
  11.         Thread a1 = new Thread(a);  
  12.         Thread a2 = new Thread(a);  
  13.         Thread a3 = new Thread(a);  
  14.         Thread a4 = new Thread(a);  
  15.   
  16.         a1.start();  
  17.         a2.start();  
  18.         a3.start();  
  19.         a4.start();  
  20.     }  
  21. }
复制代码
  1. public class test1{
  2.     public static void main(String [] args){
  3.         MyThread m=new MyThread();
  4.         Thread t1=new Thread(m,"Thread 1");
  5.         Thread t2=new Thread(m,"Thread 2");
  6.         Thread t3=new Thread(m,"Thread 3");
  7.         t1.start();         /*共运行一百次,  三条线程哪条抢到资源就运行哪条  */
  8.         t2.start();
  9.         t3.start();
  10.     }
  11. }
  12. class MyThread implements Runnable{
  13.     private int i=0;
  14.     public void run(){
  15.         while(i<100){
  16.             i++;
  17.                 System.out.println(i+"  MyThread.run "+Thread.currentThread().getName());
  18.         }
  19.     }
  20. }
复制代码

如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的。
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。

总结:

采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。

采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。







上一篇:【java进阶】java5的新特性总结
下一篇:计算机等级考试二级公共基础视频教程详解
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

微信扫一扫

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