<!--<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-N,N是线程建立的顺序,是一个不重复的正整数。
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-1和Thread-2分别是thread1和thread2的输出结果。
注意:任何一个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方法中建立了三个线程:thread1、thread2和thread3。其中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
从上面的输出结果可以看出,thread1和thread2的线程名都已经修改了,而thread3的线程名仍然为默认值:Thread-1。thread3的线程名之所以不是Thread-2,而是Thread-1,这是因为在026行已经指定了thread2的Name,因此,启动thread3时就将thread3的线程名设为Thread-1。因此就会得到上面的输出结果。
注意:在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在run方法执行完后才会执行setName。如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象。
Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常。
相关推荐
单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...
最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...
使用很方便,特别是对于初学者。 注意:请将程序设为从sub main()启动,否则会重复调用启动窗口。和其它多线程一样,不能在IDE环境调试,只能编译EXE后再调试。 特别声明:此DLL仅限于VB爱者研究使用,使用者请注明...
初学者学习java多线程的必备良师啊!! 该文档内容简单易懂 条理清晰 !! 内容包含:线程的状态及状态之间的转换 线程的优先级 线程的几大常用方法! 申明: 本文出自 “熔 岩” 博客,本人从百度文库转载而来! 大家都...
java多线程详解,里面说的很好,初学者的福音
关于多线程的PDF文档,非常清晰,很适合初学者,对于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 ...
Halcon中的多线程技术,实际项目中一定会用到,实现了采集图像和图像处理(读取图像中的二维码信息)及显示的同步运行,自己刚开始学习Halcon, 代码供初学者学习参考使用。
这是一个多线程抢占的Java代码,可以用来给初学者看看
初学者的最好的 Java培训 ppt 下载 java se java EE j2se j2ee java io ,thread ,net ,collections 多线程,集合,输入输出流 ,jdbc ,oracle数据库
对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块,很难做到不出问题。 SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不...
1.6.3 初学者容易犯的错误 18 1.7 垃圾回收机制 20 1.8 何时开始使用IDE工具 21 学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 ...
多线程池试验,很简单得,适合初学者,讲解了多线程的实验,下载就可以直接运行
linux下一个多线程文件下载的程序,适合于socket编程初学者
2. 如何防止多线程下载同一网页? 3. 如何判断线程结束? 4. 如何控制线程结束? 下面就这几个问题提出解决方法: 1. 线程数量我们可以通过for循环来实现,就如同当年初学编程的打点程序一样。 比如已知用户指定了...
我相信对初学者这是很有帮助的,了解两中实现多线程的方法的不同这处
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 ...
资源是为了完善之前一篇文章介绍的多线程编程,资源包含了4种多线程编程的简单实例, 实例非常简单易懂,适合初学者或者中级开发人员参考,如有不理解之处欢迎私信,我们项目探讨共同学习,简单说明下资源实例: 1....
比较全面的包含了c#中多线程的例子,以及少量的注释。对于初学者来讲比较适合。