当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程,因为它是程序开始时就执行的。主线程的重要性体现在两方面:
· 它是产生其他子线程的线程
· 通常它必须最后完成执行,因为它执行各种关闭动作。

尽管主线程在程序启动时自动创建,但它可以由一个Thread对象控制。为此,你必须调用方法currentThread()获得它的一个引用,currentThread()是Thread类的公有的静态成员。

它的通常形式如下:

static Thread currentThread( )

该方法返回一个调用它的线程的引用。一旦你获得主线程的引用,你就可以像控制其他线程那样控制主线程。
让我们从复习下面例题开始:

// Controlling the main Thread.
class CurrentThreadDemo { public static void main(String args[]) { Thread t = Thread.currentThread(); System.out.println("Current thread: " + t); // change the name of the thread t.setName("My Thread"); System.out.println("After name change: " + t); try { for(int n = 5; n > 0; n--) { System.out.println(n); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println("Main thread interrupted"); } }
}

在本程序中,当前线程的引用通过调用currentThread()获得,该引用保存在局部变量t中。然后,程序显示了线程的信息。接着程序调用setName()改变线程的内部名称。线程信息又被显示。

然后,一个循环数从5开始递减,每数一次暂停一秒。暂停是由sleep()方法来完成的。Sleep()语句明确规定延迟时间是1毫秒。注意循环外的try/catch块。

Thread类的sleep()方法可能引发个InterruptedException异常。

这种情形会在其他线程想要打搅沉睡线程时发生。本例只是打印了它是否被打断的消息。在实际的程序中,你必须灵活处理此类问题。下面是本程序的输出:

Current thread: Thread[main,5,main]
After name change: Thread[My Thread,5,main]
5
4
3
2
1

注意t作为语句println()中参数运用时输出的产生。该显示顺序:线程名称,优先级以及组的名称。默认情况下,主线程的名称是main。它的优先级是5,这也是默认值,main也是所属线程组的名称。一个线程组(thread group)是一种将线程作为一个整体集合的状态控制的数据结构。这个过程由专有的运行时环境来处理,在此就不赘述了。

线程名改变后,t又被输出。这次,显示了新的线程名。

让我们更仔细的研究程序中Thread类定义的方法。sleep()方法按照毫秒级的时间指示使线程从被调用到挂起。它的通常形式如下:

static void sleep(long milliseconds) throws InterruptedException

挂起的时间被明确定义为毫秒。该方法可能引发InterruptedException异常。

sleep()方法还有第二种形式,显示如下,该方法允许你指定时间是以毫秒还是以纳秒为周期。

static void sleep(long milliseconds, int nanoseconds) throws
InterruptedException

第二种形式仅当允许以纳秒为时间周期时可用。

如上述程序所示,你可以用setName()设置线程名称,用getName()来获得线程名称(该过程在程序中没有体现)。这些方法都是Thread 类的成员,声明如下:

final void setName(String threadName)
final String getName( )

这里,threadName 特指线程名称。

开课吧Java课堂:什么是主线程?如何去运用?相关推荐

  1. 开课吧Java课堂:什么是线程优先级?

    Java给每个线程安排优先级以决定与其他线程比较时该如何对待该线程.线程优先级是详细说明线程间优先关系的整数. 作为绝对值,优先级是毫无意义的:当只有一个线程时,优先级高的线程并不比优先权低的线程运行 ...

  2. 开课吧Java课堂:线程间是如何实现通信

    Java对象中隐式管程的应用是很强大的,但是你可以通过进程间通信达到更微妙的境界.这在Java中是尤为简单的. 多线程通过把任务分成离散的和合乎逻辑的单元代替了事件循环程序.线程还有第二优点:它远离了 ...

  3. 开课吧Java课堂:Transient和volatile修饰符如何运用

    Java定义了两类有趣的修饰符:transient和volatile,这些修饰符用来处理特殊的情况.如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { ...

  4. 开课吧Java课堂:如何创建多线程

    大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: · 实现Runnable 接口. · 可以继承Thread类. 为什么Java有两种创建子线程的方法?所有的问题都归 ...

  5. 开课吧Java课堂:多线程如何同步?消息如何传递?

    同步性 因为多线程在你的程序中引入了一个异步行为,所以在你需要的时候必须有加强同步性的方法.举例来说,如果你希望两个线程相互通信并共享一个复杂的数据结构,例如链表序列,你需要某些方法来确保它们没有相互 ...

  6. 开课吧Java课堂之动态方法调度

    前几篇文章的例题说明了方法重载机制,但并没有显示它们的作用.实际上,如果方法重载只是一个名字空间的约定,那么它最多是有趣的,但是没有实际价值的. 然而,情况并不如此.方法重载构成Java的一个最强大的 ...

  7. 开课吧Java课堂之如何使用FilenameFilter

    你总是希望能够限制由list( )方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件.为达到这样的目的,必须使用list( )的第二种形式: String[ ] ...

  8. 开课吧Java课堂:如何使用比较函数?

    下面是一个说明定制的比较函数能力的例子.该例子实现compare( )方法以便它按正常顺序的逆向进行操作.因此,它使得一个树集合按逆向的顺序进行存储. // Use a custom comparat ...

  9. 开课吧Java课堂:是什么是比较函数?

    TreeSet和TreeMap都按排序顺序存储元素.然而,精确定义采用何种"排序顺序"的是比较函数. 通常在默认的情况下,这些类通过使用被Java称之为"自然顺序&quo ...

最新文章

  1. Navicat Premium 12全系列
  2. 皮一皮:人生就像编程,总有防不胜防的bug会被人发现...
  3. leetcode算法题--删除链表的节点
  4. solr查询工作原理深入内幕
  5. CodeForces - 1228B Filling the Grid(思维,水题)
  6. ReenTrantLock可重入锁(和synchronized的区别)总结
  7. python阴阳师_如何用Python找到阴阳师妖怪屋的最佳探索队伍!强不强?
  8. 机器学习笔记(十四)——HMM估计问题和前向后向算法
  9. 刷题总结——树的同构(bzoj4337 树上hash)
  10. visualstudio2019 的报表技术rdlc在windows10上出现乱码的问题解决方法
  11. 前端常用效果(3)带动画的比较型柱状图
  12. python的文件夹_Python文件夹与文件的操作
  13. ORACLE 36进制和10进制,互相转换函数
  14. 记使用sed的一次坑
  15. 20200106每日一句
  16. 汽车销售管理系统 c语言版 课程设计,《汽车销售管理系统 C语言版》.doc
  17. Oracle 索引详解(index)
  18. c语言中结构体中默认值,C Struct中的缺省值
  19. DeFi 2.0的LaaS协议Elephant,重振DeFi赛道发展的关键
  20. 2022-2027年中国农用机械融资租赁行业发展监测及投资战略咨询报告

热门文章

  1. [转载] Python版简易计算器的实现
  2. [转载] Java static关键字详解
  3. 生成随机验证码,上传图片文件,解析HTML
  4. 【习题 3-1 UVA - 1585】Score
  5. css3 Gradient背景
  6. EBS R12.2 创建应用层的启动和关闭脚本
  7. 编写高质量javascript代码的基本要点
  8. 该网站可能含有恶意软件,有可能会危害您的电脑 清除办法
  9. 数据结构上机实践第11周项目1 - 图基本算法库
  10. Ubuntu下安装opencv3.2.0,解决anaconda下的Python和安装opencv3.2.0冲突的问题