博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建线程究竟该用第几种方式
阅读量:2173 次
发布时间:2019-05-01

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

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接口的方式来完成的。

转载地址:http://qfgzb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】202-Happy Number
查看>>
和机器学习和计算机视觉相关的数学
查看>>
十个值得一试的开源深度学习框架
查看>>
【LEETCODE】240-Search a 2D Matrix II
查看>>
【LEETCODE】53-Maximum Subarray
查看>>
【LEETCODE】215-Kth Largest Element in an Array
查看>>
【LEETCODE】241-Different Ways to Add Parentheses
查看>>
【LEETCODE】312-Burst Balloons
查看>>
【LEETCODE】232-Implement Queue using Stacks
查看>>
【LEETCODE】225-Implement Stack using Queues
查看>>
【LEETCODE】155-Min Stack
查看>>
【LEETCODE】20-Valid Parentheses
查看>>
【LEETCODE】290-Word Pattern
查看>>
【LEETCODE】36-Valid Sudoku
查看>>
【LEETCODE】205-Isomorphic Strings
查看>>
【LEETCODE】204-Count Primes
查看>>
【LEETCODE】228-Summary Ranges
查看>>
【LEETCODE】27-Remove Element
查看>>
【LEETCODE】66-Plus One
查看>>
【LEETCODE】26-Remove Duplicates from Sorted Array
查看>>