`
catalin
  • 浏览: 15937 次
  • 来自: ...
社区版块
存档分类
最新评论

Java多线程初学者指南(2):用Thread类创建线程

阅读更多
本文为转载,http://student.csdn.net/space.php?uid=44933&do=blog&id=8948
     Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

Runnable target

实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

String name

线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-NN是线程建立的顺序,是一个不重复的正整数。

ThreadGroup group

当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。

long stackSize

    线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB。在x86平台下,默认的线程栈大小是12KB

一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  001  package mythread;
  
002  
  
003  public class Thread1 extends Thread
  
004  {
  
005      public void run()
  
006      {
  
007          System.out.println(this.getName());
  
008      }
  
009      public static void main(String[] args)
  
010      {
  
011          System.out.println(Thread.currentThread().getName());
  
012          Thread1 thread1 = new Thread1();
  
013          Thread1 thread2 = new Thread1 ();
  
014          thread1.start();
  
015          thread2.start();
  
016      }
  
017  }


     上面的代码建立了两个线程:thread1和thread2。上述代码中的005至008行是Thread1类的run方法。当在014和015行调用 start方法时,系统会自动调用run方法。在007行使用this.getName()输出了当前线程的名字,由于在建立线程时并未指定线程名,因 此,所输出的线程名是系统的默认值,也就是Thread-n的形式。在011行输出了主线程的线程名。
    上面代码的运行结果如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->main
Thread-
0
Thread-
1

 

从上面的输出结果可以看出,第一行输出的main是主线程的名子。后面的Thread-1Thread-2分别是thread1thread2的输出结果。

注意:任何一个Java程序都必须有一个主线程。一般这个主线程的名子为main。只有在程序中建立另外的线程,才能算是真正的多线程程序。也就是说,多线程程序必须拥有一个以上的线程。
    Thread类有一个重载构造方法可以设置线程名。除了使用构造方法在建立线程时设置线程名,还可以使用Thread类的setName方法修改线程名。要想通过Thread类的构造方法来设置线程名,必须在Thread的子类中使用Thread类的public Thread(String name)构造方法,因此,必须在Thread的子类中也添加一个用于传入线程名的构造方法。下面的代码给出了一个设置线程名的例子:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->  001  package mythread;
  
002  
  
003  public class Thread2 extends Thread
  
004  {
  
005      private String who;
  
006  
  
007      public void run()
  
008      {
  
009          System.out.println(who + ":" + this.getName());
  
010      }
  
011      public Thread2(String who)
  
012      {
  
013          super();
  
014          this.who = who;
  
015      }
  
016      public Thread2(String who, String name)
  
017      {
  
018          super(name);
  
019          this.who = who;
  
020      }
  
021      public static void main(String[] args)
  
022      {
  
023          Thread2 thread1 = new Thread2 ("thread1""MyThread1");
  
024          Thread2 thread2 = new Thread2 ("thread2");
  
025          Thread2 thread3 = new Thread2 ("thread3");
  
026          thread2.setName("MyThread2");
  
027          thread1.start();
  
028          thread2.start();
  
029          thread3.start();
  
030      }
  
031  

 

在类中有两个构造方法:

011行:public sample2_2(String who)

这个构造方法有一个参数:who。这个参数用来标识当前建立的线程。在这个构造方法中仍然调用Thread的默认构造方法public Thread( )

016行:public sample2_2(String who, String name)

这个构造方法中的who和第一个构造方法的who的含义一样,而name参数就是线程的名名。在这个构造方法中调用了Thread类的public Thread(String name)构造方法,也就是第018行的super(name)

main方法中建立了三个线程:thread1thread2thread3。其中thread1通过构造方法来设置线程名,thread2通过setName方法来修改线程名,thread3未设置线程名。

    运行结果如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->thread1:MyThread1
thread2:MyThread2
thread3:Thread-
1

 

从上面的输出结果可以看出,thread1thread2的线程名都已经修改了,而thread3的线程名仍然为默认值:Thread-1thread3的线程名之所以不是Thread-2,而是Thread-1,这是因为在026已经指定了thread2的Name,因此,启动thread3时就将thread3的线程名设为Thread-1因此就会得到上面的输出结果。

注意:在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在run方法执行完后才会执行setName。如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象。

Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常。
分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码)

    单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    VB创建线程动态链接库(VBCreateThread.dll)

    使用很方便,特别是对于初学者。 注意:请将程序设为从sub main()启动,否则会重复调用启动窗口。和其它多线程一样,不能在IDE环境调试,只能编译EXE后再调试。 特别声明:此DLL仅限于VB爱者研究使用,使用者请注明...

    Java线程:线程状态的转换

    初学者学习java多线程的必备良师啊!! 该文档内容简单易懂 条理清晰 !! 内容包含:线程的状态及状态之间的转换 线程的优先级 线程的几大常用方法! 申明: 本文出自 “熔 岩” 博客,本人从百度文库转载而来! 大家都...

    java多线程详解

    java多线程详解,里面说的很好,初学者的福音

    Java多线程.pdf

    关于多线程的PDF文档,非常清晰,很适合初学者,对于Java多线程开发的学习有所帮助。

    java-Thread-study-summary.zip_java 多线程

    对多线程进行了由浅入深的讲解,有丰富的实例让初学者更容易上手

    java学习笔记 初学者必读

    2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}”、“ ” 3-5 3.3. 标识符 3-5 3.4. 数据类型 3-6 3.5. 命名规则 3-6 4. 三•表达式和控制流 4-6 ...

    Halcon12+VisualStudio2013实现多线程

    Halcon中的多线程技术,实际项目中一定会用到,实现了采集图像和图像处理(读取图像中的二维码信息)及显示的同步运行,自己刚开始学习Halcon, 代码供初学者学习参考使用。

    这是一个多线程的Java代码

    这是一个多线程抢占的Java代码,可以用来给初学者看看

    初学者的最好的 Java培训 ppt 下载

    初学者的最好的 Java培训 ppt 下载 java se java EE j2se j2ee java io ,thread ,net ,collections 多线程,集合,输入输出流 ,jdbc ,oracle数据库

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块,很难做到不出问题。 SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不...

    疯狂JAVA讲义

    1.6.3 初学者容易犯的错误 18 1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 ...

    Multi-thread-pool-test.zip_ CSharp thread_thread pool_多线程下载_等高线

    多线程池试验,很简单得,适合初学者,讲解了多线程的实验,下载就可以直接运行

    linux下多线程文件下载源码

    linux下一个多线程文件下载的程序,适合于socket编程初学者

    c#多线程抓取网页内容

    2. 如何防止多线程下载同一网页? 3. 如何判断线程结束? 4. 如何控制线程结束? 下面就这几个问题提出解决方法: 1. 线程数量我们可以通过for循环来实现,就如同当年初学编程的打点程序一样。 比如已知用户指定了...

    多线程的Runnable_和thread有什么区别

    我相信对初学者这是很有帮助的,了解两中实现多线程的方法的不同这处

    21天学通Java-由浅入深

    245 12.3.3 在外部类外访问静态内部类 246 12.4 匿名内部类 247 12.4.1 创建匿名内部类 247 12.4.2 匿名内部类的初始化 249 12.5 综合练习 250 12.6 小结 250 12.7 习题 250 第13章 多线程(精彩视频:55分钟) 252 ...

    Qt多线程编程实例,资源包含了4种多线程编程的简单实例

    资源是为了完善之前一篇文章介绍的多线程编程,资源包含了4种多线程编程的简单实例, 实例非常简单易懂,适合初学者或者中级开发人员参考,如有不理解之处欢迎私信,我们项目探讨共同学习,简单说明下资源实例: 1....

    c# 多线程 demo

    比较全面的包含了c#中多线程的例子,以及少量的注释。对于初学者来讲比较适合。

Global site tag (gtag.js) - Google Analytics