`
ticojj
  • 浏览: 156644 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

麻痹的线程,老子一定搞懂你

    博客分类:
  • java
 
阅读更多
【通过继承Thread】

  一个Thread对象只能创建一个线程,即使它调用多次的.start()也会只运行一个的线程。

  【看下面的代码 & 输出结果】


1 package Test;
2
3 class CTest extends Thread {
4     private int tickte = 20;
5
6     public void run() {
7         while (true) {
8             if (tickte > 0) {
9                 System.out.println(Thread.currentThread().getName() + " 出售票 "
10                         + tickte--);
11             } else {
12                 System.exit(0);
13             }
14         }
15     }
16
17 }
18
19 public class Demo3 {
20     public static void main(String[] args) {
21         // new CTest().start();
22         // new CTest().start();
23         Thread t1 = new CTest();//创建一个线程
24         t1.start();
25         t1.start();
26     }
27 }
28
29 //
30 Thread-0 出售票 20
31 Thread-0 出售票 19
32 Thread-0 出售票 18
33 Thread-0 出售票 17
34 Thread-0 出售票 16
35 Thread-0 出售票 15
36 Thread-0 出售票 14
37 Thread-0 出售票 13
38 Thread-0 出售票 12
39 Thread-0 出售票 11
40 Thread-0 出售票 10
41 Thread-0 出售票 9
42 Thread-0 出售票 8
43 Thread-0 出售票 7
44 Thread-0 出售票 6
45 Thread-0 出售票 5
46 Thread-0 出售票 4
47 Thread-0 出售票 3
48 Thread-0 出售票 2
49 Thread-0 出售票 1
通过调用当前线程对象的名字Thread.currentThread.getName(),根据结果可以看出,只运行了一个线程。

这就说明了一个问题,每创建一个Thread对象,只能创建一个线程。

下面是创建多个Thread对象。




package Test;

class CTest extends Thread {
    private int tickte = 20;

    public void run() {
        while (true) {
            if (tickte > 0) {
                System.out.println(Thread.currentThread().getName() + " 出售票 "
                        + tickte--);
            } else {
                System.exit(0);
            }
        }
    }

}

public class Demo3 {
    public static void main(String[] args) {
         new CTest().start();
         new CTest().start();
    }
} 上面启动了两个线程对象,他们各自执行自己的互不影响。

结果:


Thread-0 出售票 20
Thread-1 出售票 20
Thread-1 出售票 19
Thread-0 出售票 19
Thread-0 出售票 18
Thread-0 出售票 17
Thread-0 出售票 16
Thread-0 出售票 15
Thread-0 出售票 14
Thread-0 出售票 13
Thread-0 出售票 12
Thread-0 出售票 11
Thread-0 出售票 10
Thread-0 出售票 9
Thread-0 出售票 8
Thread-0 出售票 7
Thread-0 出售票 6
Thread-0 出售票 5
Thread-0 出售票 4
Thread-0 出售票 3
Thread-0 出售票 2
Thread-0 出售票 1
Thread-1 出售票 18
Thread-1 出售票 17
Thread-1 出售票 16
Thread-1 出售票 15
Thread-1 出售票 14
Thread-1 出售票 13
Thread-1 出售票 12
Thread-1 出售票 11
Thread-1 出售票 10
Thread-1 出售票 9
Thread-1 出售票 8
Thread-1 出售票 7
Thread-1 出售票 6
Thread-1 出售票 5
Thread-1 出售票 4
Thread-1 出售票 3
Thread-1 出售票 2
Thread-1 出售票 1可以看出是创建了两个线程。他们各自执行自己的线程,互不影响。

【多个线程操作一个对象】

  


01 public class ThreadDemo9_4
02 {
03   public static void main(String [] args)
04  {
05    TestThread t = new TestThread() ;
06 // 启动了四个线程,并实现了资源共享的目的
07   new Thread(t).start();
08   new Thread(t).start();
09   new Thread(t).start();
10   new Thread(t).start();
11  }
12 }
13  class TestThread implements Runnable
14 {
15  private int tickets=20;
16   public void run()
17  {
18 while(true)
19  {
20 if(tickets>0)
21 System.out.println(Thread.currentThread().getName()+"出售票"+tickets--);
22  }
23  }
24 }上面通过实现Runnable的方式启动四个进程,但是他们共同操纵同一对象,实现了资源的互斥共享。

结果:


Thread-1 出售票 10
Thread-1 出售票 8
Thread-1 出售票 7
Thread-1 出售票 6
Thread-1 出售票 5
Thread-2 出售票 9
Thread-1 出售票 4
Thread-1 出售票 2
Thread-1 出售票 1
Thread-2 出售票 3  可以看出,虽然是两个线程,但是操作的却只有一个资源。但是从程序的输出结果来看,尽管启动了两个线程对象,但是结果都是操纵了同一个资源,实现了资源共享的目的。

  可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势:
(1)、 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
(2)、 可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
(3)、 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

  可以将一个Runnable接口的实例化对象作为参数去实例化Thread类对象。在实际的开发中,希望读者尽可能去使用Runnable接口去实现多线程机制。
分享到:
评论

相关推荐

    【uin-app+vue开发微信小程序】懂你找图.zip

    【uin-app+vue开发微信小程序】懂你找图.zip

    Linux——其实我懂你的“心”.pdf

    Linux——其实我懂你的“心”.pdf

    哈工大 操作系统实验8 linux0.01内核级线程代码及相关提交

    最难得一个,本人只完成了用户态线程...那一定要完全搞懂你所见到的,改一改,再改一改,改到你发现面目全非为止,恭喜你,它已经完全是你的东西了,希望说这么多,可以真正帮助到弟弟妹妹们哦。ps:我的老师是孙志岗。

    懂你.doc

    懂你.doc

    主题之十一懂你.doc

    【婚礼策划案】本次婚礼的主题为“懂你”,围绕着新人之间深深的理解和情感纽带展开。婚礼策划注重情感表达和故事叙述,通过音乐、誓言和仪式来展现新人间的真挚感情。 【开场白】开场白以主持人的话语引领,强调...

    教育教学-懂你漫画app v1.0.zip

    通常,v1.0标志着产品已经具备了基本的功能,并且经过了一定程度的测试,可以对外发布。后续可能会有v1.1、v2.0等更新,以修复问题、增加新功能或优化用户体验。 【潜在知识点】 1. **移动教育**:探讨如何利用移动...

    我懂你了初三作文.pdf

    我懂你了初三作文.pdf

    中考语文满分作文懂你

    这篇中考满分作文“懂你”以作者对母爱的理解与成长过程中的变化为主线,揭示了亲情的深沉与真挚。文章通过回忆小时候对母亲的依恋,到青少年时期对母亲的误解,再到最终理解母爱的过程,展现了作者对母爱的深度反思...

    《懂你》原创主题婚礼策划方案.doc

    【婚礼策划方案——《懂你》】 《懂你》是一个以爱情故事为主题的原创婚礼策划方案,旨在通过音乐、故事和仪式,展现新人之间深厚的情感连接。整场婚礼以歌曲《懂你》为情感线索,贯穿始终,寓意新人彼此理解、珍视...

    懂你英语lv5unit2资料讲解.pdf

    懂你英语lv5unit2资料讲解.pdf

    懂你的人,最温暖的伴.doc

    懂你的人,最温暖的伴.doc

    初中语文文摘情感我想懂你

    【标题】:“初中语文文摘情感我想懂你”——青少年情感理解与沟通的重要性 【描述】:这篇文摘反映了青少年在面对情感困扰时的心理状态,尤其是对于理解和沟通的渴望。文章通过一个情感故事,展现了青春期的爱慕、...

    懂你英语Level5Unit1Part2.pdf

    【懂你英语Level5Unit1Part2】是一个学习材料,主要涵盖了英语听力理解的练习,以情境对话的形式呈现。这个部分的故事围绕着Jessica参加她的20年同学聚会展开。在聚会中,Jessica经历了一系列的情感变化,反映出人际...

    我是真的懂你作文.doc

    这篇作文的标题是《我是真的懂你》,通过描述两位古代文人的遭遇,展现了作者对于人物内心世界的深刻理解和同情。文章以梦境的形式展开,作者在梦中遇见了唐朝伟大的浪漫主义诗人李白和战国时期的楚国诗人屈原。 ...

    家电行业周报:AWE上海隆重开幕,AI让家电更懂你.pdf

    家电行业周报:AWE上海隆重开幕,AI让家电更懂你.pdf

    懂你英语l4unit1资料讲解.pdf

    【懂你英语L4 Unit 1 资料讲解】 本单元主要围绕旅游主题展开,通过主人公Christina的旅行经历,介绍了与旅游相关的词汇、表达和背景知识。Christina正在享受她久违的两周假期,这是她两年多以来的第一次休假。上一...

    巾帼不让PCB懂你的美——杨柳:永不停步的逐梦者.pdf

    巾帼不让PCB懂你的美——杨柳:永不停步的逐梦者.pdf

    懂你英语L4unit1翻译版.docx

    这篇文档是关于“懂你英语”课程L4单元1的听力部分,内容涉及主人公Christina的一次旅行经历。Christina在时隔两年多后终于迎来了两周的假期,她选择去旧金山看望朋友。她的朋友和丈夫居住在市中心,朋友的丈夫在...

    懂你英语lv5unit3教学内容.pdf

    【懂你英语lv5unit3教学内容.pdf】的这篇材料主要讲述了主人公Sam在Ace Express公司的工作经历、职业发展以及他当前面临的职场选择。这个故事涵盖了职业规划、公司运营、求职策略等多个IT行业之外但与个人职业发展...

Global site tag (gtag.js) - Google Analytics