关闭

创建线程究竟该用第几种方式

标签: 究竟创建线程改用第几种方式
466人阅读 评论(0) 收藏 举报
分类:

2015年11月19日10:05:31

作者:数据分析玩家

题目:现实中创建线程究竟该用第几种方式

例子1:

//用第一种方法创建线程:每个线程处理的是不同的资源

//每个线程分别对应20张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系

class Tc extends Thread  
{
     private int tickets = 20;//每个线程各自卖20张票
     
     public String name ;
     public Tc(String name)
     {
        this.name = name;
     }
     public void run()
     {
        while(tickets > 0)
        {
           System.out.printf("%s窗口正在售%d张票\n",name,tickets);
           tickets --;
        }    
     }
}
public class zhang3
{
     public static void main(String[] args)
     {
       Tc t1 = new Tc("老人窗口----");
       t1.run();//实现一个窗口卖票
       
       Tc t2 = new Tc("-------儿童窗口");
       t2.run();//不同的类对象,其属性占用不同的内存空间,这是根本
       
       Tc t3 = new Tc("---中年窗口---");
       t3.run();
     }
}

/*
运行结果:
老人窗口----窗口正在售20张票
老人窗口----窗口正在售19张票
老人窗口----窗口正在售18张票
老人窗口----窗口正在售17张票
老人窗口----窗口正在售16张票
老人窗口----窗口正在售15张票
老人窗口----窗口正在售14张票
老人窗口----窗口正在售13张票
老人窗口----窗口正在售12张票
老人窗口----窗口正在售11张票
老人窗口----窗口正在售10张票
老人窗口----窗口正在售9张票
老人窗口----窗口正在售8张票
老人窗口----窗口正在售7张票
老人窗口----窗口正在售6张票
老人窗口----窗口正在售5张票
老人窗口----窗口正在售4张票
老人窗口----窗口正在售3张票
老人窗口----窗口正在售2张票
老人窗口----窗口正在售1张票
-------儿童窗口窗口正在售20张票
-------儿童窗口窗口正在售19张票
-------儿童窗口窗口正在售18张票
-------儿童窗口窗口正在售17张票
-------儿童窗口窗口正在售16张票
-------儿童窗口窗口正在售15张票
-------儿童窗口窗口正在售14张票
-------儿童窗口窗口正在售13张票
-------儿童窗口窗口正在售12张票
-------儿童窗口窗口正在售11张票
-------儿童窗口窗口正在售10张票
-------儿童窗口窗口正在售9张票
-------儿童窗口窗口正在售8张票
-------儿童窗口窗口正在售7张票
-------儿童窗口窗口正在售6张票
-------儿童窗口窗口正在售5张票
-------儿童窗口窗口正在售4张票
-------儿童窗口窗口正在售3张票
-------儿童窗口窗口正在售2张票
-------儿童窗口窗口正在售1张票
---中年窗口---窗口正在售20张票
---中年窗口---窗口正在售19张票
---中年窗口---窗口正在售18张票
---中年窗口---窗口正在售17张票
---中年窗口---窗口正在售16张票
---中年窗口---窗口正在售15张票
---中年窗口---窗口正在售14张票
---中年窗口---窗口正在售13张票
---中年窗口---窗口正在售12张票
---中年窗口---窗口正在售11张票
---中年窗口---窗口正在售10张票
---中年窗口---窗口正在售9张票
---中年窗口---窗口正在售8张票
---中年窗口---窗口正在售7张票
---中年窗口---窗口正在售6张票
---中年窗口---窗口正在售5张票
---中年窗口---窗口正在售4张票
---中年窗口---窗口正在售3张票
---中年窗口---窗口正在售2张票
---中年窗口---窗口正在售1张票

*/

例子2:

//用第二中方式来创建线程:同样每个线程可以处理不同的资源
class Tc implements Runnable 
{
     private int tickets = 20;//每个线程各自卖20张票
     
     public String name ;
     public Tc(String name)
     {
        this.name = name;
     }
     public void run()
     {
        while(tickets > 0)
        {
           System.out.printf("%s窗口正在售%d张票\n",name,tickets);
           tickets --;
        }    
     }
}
public class zhang4
{
     public static void main(String[] args)
     {
       Tc aa = new Tc("老人窗口----");
       Thread t1 = new Thread(aa); 
       t1.run();//实现一个窗口卖票
       
       Tc bb = new Tc("-------儿童窗口");
       Thread t2 = new Thread(bb);
       t2.run();//不同的类对象,其属性占用不同的内存空间,这是根本
       
       Tc cc = new Tc("---中年窗口---");
       Thread t3 = new Thread(cc);
       t3.run();
     }
}

/*
运行结果:和上面的程序相同
老人窗口----窗口正在售20张票
老人窗口----窗口正在售19张票
老人窗口----窗口正在售18张票
老人窗口----窗口正在售17张票
老人窗口----窗口正在售16张票
老人窗口----窗口正在售15张票
老人窗口----窗口正在售14张票
老人窗口----窗口正在售13张票
老人窗口----窗口正在售12张票
老人窗口----窗口正在售11张票
老人窗口----窗口正在售10张票
老人窗口----窗口正在售9张票
老人窗口----窗口正在售8张票
老人窗口----窗口正在售7张票
老人窗口----窗口正在售6张票
老人窗口----窗口正在售5张票
老人窗口----窗口正在售4张票
老人窗口----窗口正在售3张票
老人窗口----窗口正在售2张票
老人窗口----窗口正在售1张票
-------儿童窗口窗口正在售20张
-------儿童窗口窗口正在售19张
-------儿童窗口窗口正在售18张
-------儿童窗口窗口正在售17张
-------儿童窗口窗口正在售16张
-------儿童窗口窗口正在售15张
-------儿童窗口窗口正在售14张
-------儿童窗口窗口正在售13张
-------儿童窗口窗口正在售12张
-------儿童窗口窗口正在售11张
-------儿童窗口窗口正在售10张
-------儿童窗口窗口正在售9张票
-------儿童窗口窗口正在售8张票
-------儿童窗口窗口正在售7张票
-------儿童窗口窗口正在售6张票
-------儿童窗口窗口正在售5张票
-------儿童窗口窗口正在售4张票
-------儿童窗口窗口正在售3张票
-------儿童窗口窗口正在售2张票
-------儿童窗口窗口正在售1张票
---中年窗口---窗口正在售20张票
---中年窗口---窗口正在售19张票
---中年窗口---窗口正在售18张票
---中年窗口---窗口正在售17张票
---中年窗口---窗口正在售16张票
---中年窗口---窗口正在售15张票
---中年窗口---窗口正在售14张票
---中年窗口---窗口正在售13张票
---中年窗口---窗口正在售12张票
---中年窗口---窗口正在售11张票
---中年窗口---窗口正在售10张票
---中年窗口---窗口正在售9张票
---中年窗口---窗口正在售8张票
---中年窗口---窗口正在售7张票
---中年窗口---窗口正在售6张票
---中年窗口---窗口正在售5张票
---中年窗口---窗口正在售4张票
---中年窗口---窗口正在售3张票
---中年窗口---窗口正在售2张票
---中年窗口---窗口正在售1张票

*/

这说明当处理的是不同的资源的时候,两种方式都可以使用

例子3:

//接着用第二中方式创建线程:多个线程处理的是同一资源
class Tc implements Runnable 
{
     private int tickets = 10000;//3个线程一共处理100张票
     
     public void run()
     {       
           while(true)
           {
            synchronized("zhang")
            {
            if(tickets > 0)
               {              
               System.out.printf("%s窗口正在售%d张票\n",Thread.currentThread().getName(),tickets);
                  tickets --;
                
               }
               else
                 break;          
            }           
           }                              
     }
}
public class zhang5
{
     public static void main(String[] args)
     {
       Tc aa = new Tc();
       Thread t1 = new Thread(aa);   //aa对象
       t1.setName("老人窗口");
       t1.start();//实现一个窗口卖票
       
       Thread t2 = new Thread(aa);   //aa对象
       t2.setName("儿童窗口");
       t2.start();//不同的类对象,其属性占用不同的内存空间,这是根本
       
       Thread t3 = new Thread(aa);   //aa对象  
       t3.setName("中年窗口");    
       t3.start();
     }
}

/*
运行结果是:三个售票口共同处理1000张票
*/

综上,我们可以得出结论:

实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。

这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,
从而特别适合多个具有相同代码的线程去处理同一资源的情况。
这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。
因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

创建线程的几种方法及比较

1、通过继承Thread类创建线程 (1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。 (2).直接创建一个ThreadTest类的对象,也可以利用多态性,变量声明为父类的类型。 (3).调用start方法,线程启动,隐含的...
  • u012470138
  • u012470138
  • 2016-11-21 10:17
  • 2513

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一、继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来...
  • longshengguoji
  • longshengguoji
  • 2014-11-14 22:14
  • 89491

创建线程有几种不同的方式?

①继承Thread类(真正意义上的线程类),是Runnable接口的实现。 ②实现Runnable接口,并重写里面的run方法。 ③使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。 调用线程的start():启动此线程;调用相应的run()方法 继承于T...
  • wang_xing1993
  • wang_xing1993
  • 2017-04-20 10:45
  • 2566

java创建线程的四种方式

java创建线程的三种方式 1. 继承Thread类创建线程类 2. 通过Runable接口创建线程类 3. 通过Callable和FutureTask创建线程     a. 创建Callable接口的实现类,并实现call()方法;    ...
  • u012973218
  • u012973218
  • 2016-04-29 10:51
  • 2688

创建线程的三种方法

第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务。 第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务。 第三种方法:实现callable接口,重写call()方法,call()作为线程的执行体,具有返回值,并且可以对异...
  • baidu_21578557
  • baidu_21578557
  • 2016-04-16 21:34
  • 5321

线程同步的几种方式

 ---------------------用户模式下的同步对象---------------------- ----------1、 临界区(CCriticalSection)------------------- 当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程...
  • u011200925
  • u011200925
  • 2017-02-17 17:47
  • 1662

iOS多线程几种不同方式简单使用

iOS多线程几种不同方式简单使用: 1、performSelector.... 2、NSThread 3、NSOperation 4、gcd
  • lvdezhou
  • lvdezhou
  • 2015-11-09 09:28
  • 2377

Executors类中创建线程池的几种方法的分析

Executors类中创建线程池的几种方法的分析要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。1、newFixedThreadPool:创建固定大小的线程池。线程池的大小...
  • u010412719
  • u010412719
  • 2016-09-09 18:39
  • 1198

创建线程的两种方式区别

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run...
  • Krito_blog
  • Krito_blog
  • 2017-02-01 12:49
  • 1453

有两种实现多线程的方式以及两种方式之间的区别

Java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢?          为了回答这个问题,我们可以通过编写一段代码来进行分析。...
  • u013449800
  • u013449800
  • 2014-08-22 18:40
  • 3938
    个人资料
    • 访问:619431次
    • 积分:8992
    • 等级:
    • 排名:第2439名
    • 原创:332篇
    • 转载:87篇
    • 译文:0篇
    • 评论:111条
    最新评论