Java基础之线程——派生自Thread类的子类(TryThread)
控制台程序。
程序总是至少有一个线程,程序开始执行时就会创建这个线程。在普通的Java应用程序中,这个线程从mian()方法的开头启动。
要开始执行线程,可以调用Thread对象的start()方法。在新线程中执行的代码总是一个名为run()的方法,这是一个公共方法,不带参数,也没有返回值。程序中除了主线程之外的其他线程总是在表示线程的对象的run()方法中启动。
如果希望用于表示程序中线程的类执行某些操作,就必须为类实现run()方法,因为从Thread类继承的run()方法什么也不做。
重点:程序没有调用run()方法来启动线程,而是调用表示线程对象额start()方法,进而调用run()方法。
可以用以下两种方法来定义表示线程的类:
1、定义Thread的子类,提供run()方法的定义以重写继承而来的方法。
2、把自己的类定义为实现了Runnable()接口,这个接口声明了run()方法,之后再在需要时在自己的类中创建Thread对象。
下面为使用第一种方法:
import java.io.IOException; public class TryThread extends Thread {
public TryThread(String firstName, String secondName, long delay) {
this.firstName = firstName; // Store the first name
this.secondName = secondName; // Store the second name
aWhile = delay; // Store the delay
setDaemon(true); // Thread is daemon
} public static void main(String[] args) {
// Create three threads
Thread first = new TryThread("Hopalong ", "Cassidy ", 200L);
Thread second = new TryThread("Marilyn ", "Monroe ", 300L);
Thread third = new TryThread("Slim ", "Pickens ", 500L); System.out.println("Press Enter when you have had enough...\n");
first.start(); // Start the first thread
second.start(); // Start the second thread
third.start(); // Start the third thread try {
System.in.read(); // Wait until Enter key pressed
System.out.println("Enter pressed...\n"); } catch (IOException e) { // Handle IO exception
System.err.println(e); // Output the exception
}
System.out.println("Ending main()");
return;
} // Method where thread execution will start
@Override
public void run() {
try {
while(true) { // Loop indefinitely...
System.out.print(firstName); // Output first name
sleep(aWhile); // Wait aWhile msec.
System.out.print(secondName + "\n"); // Output second name
}
} catch(InterruptedException e) { // Handle thread interruption
System.out.println(firstName + secondName + e); // Output the exception
}
} private String firstName; // Store for first name
private String secondName; // Store for second name
private long aWhile; // Delay in milliseconds
}
当程序运行到System.in.read()语句时,会暂停等待用户通过键盘输入数据。用户可以输入一个或多个字符,然后按Enter键。System.in.read()语句只会读取第一个字符,然后继续运行下面的语句。
执行System.in.read()方法将从键盘缓冲区读入一个字节的数据,然而返回的却是16比特的整型量的低位字节是真正输入的数据,其高位字节全是零。当键盘缓冲区中没有未被读取的数据时,执行System.in.read()将导致系统转入阻塞(block)状态。在阻塞状态上,当前流程将停留在上述语句位置且整个程序被挂起,等待用户输入一个键盘数据后,才能继续运行下去;所以程序中有时利用System.in.read()语句来达到暂时保留屏幕的目地。
在TryThread构造函数中,用参数true调用setDaemon()方法会创建后台线程(Daemon Thread)。后台线程是从属于创建它的线程的背景线程,所以当创建它的线程结束时,后台线程也会结束。
用户线程拥有自己的生命周期,而且并不取决于创建它的线程。在创建它的线程结束后,用户线程可以继续执行。包含main()方法的默认线程是用户线程。
注意线程只有的启动前才能调用setDaemon()方法,如果在启动过线程后调用,setDaemon()方法就会抛出IllegalThreadStateException异常。
另外,由后台线程创建的线程也默认为后台线程。
注:daemon英 ['di:mən] 美 ['di:mən]
n. (希腊神话中)半人半神的精灵;守护神;[计]守护进程
Java基础之线程——派生自Thread类的子类(TryThread)的更多相关文章
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- JAVA基础之线程
个人理解: 在相同的进程也就是运行同样的程序的前提下,线程越多效率越快!当然硬件也是个障碍!为了提高效率,可以多创建线程,但是也不是越多越好,这就需要了线程池进行管理!需要知道的线程实现的方法:继承T ...
- java基础4(线程)
1.请简单描述什么是并行,什么是并发? 并行:指两个或多个事件在同一时刻发生(同时发生). 并发:指两个或多个事件在同一个时间段内发生. 通俗易懂版: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础-IO流对象之字符类(FileWrite与FileReader)
Java基础-IO流对象之字符类(FileWrite与FileReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见编码简介 1>ASCII 我们知道计算机是 ...
- Java基础-IO流对象之File类
Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...
- Java之多线程方式一(继承Thread类)
/** * 多线程的创建,方式一:继承于Thread类 * 1. 创建一个继承于Thread类的子类 * 2. 重写Thread类的run() --> 将此线程执行的操作声明在run()中 * ...
- JAVA基础(二)—— 常用的类与方法
JAVA基础(二)-- 常用的类与方法 1 Math类 abs ceil floor 绝对值 大于等于该浮点数的最小整数 小于等于该浮点数的最大整数 max min round 两参数中较大的 两参数 ...
- JAVA基础语法:函数(方法)、类和对象(转载)
4.JAVA基础语法:函数(方法).类和对象 函数 在java中函数也称为方法,是一段具备某种功能的可重用代码块. 一个函数包括这几部分: 函数头 函数头包括函数访问修饰符,函数返回值类型, 函数名, ...
随机推荐
- PHPStorm下XDebug配置
PHPStorm下XDebug配置 分类: PHP2013-08-11 22:15 19697人阅读 评论(0) 收藏 举报 目录(?)[+] 1安装Xdebug 用yum安装可能会失败,用p ...
- ecshop session机制
ecshop session机制 2014-06-12 1455 懒人程序 ecshop的cls_session.php分析,主要是讲述ecshop中的session机制.我们都知道 ...
- PHP Error 和 Logging 函数
PHP Error 和 Logging 函数 PHP Error 和 Logging 简介 Error 和 Logging 函数允许您对错误进行处理和记录. Error 函数允许用户定义错误处理规则, ...
- Js(javaScript)的闭包原理
问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 小编 ...
- 将对象转换成Dictionary 字典
/// <summary> /// /// 将对象属性转换为key-value对 /// </summary> /// <param name="o" ...
- VS下如何调试多线程
四步即可 1.打开多线程窗口,找到当前线程 此时,出现窗口如下: 2.右击任意位置,选中全部线程 3.停止全部线程 此时,线程状态如下: 4.单独启动当前线程:先单击当前线程,在点击启动按钮,如下红色 ...
- Spring @Resource、@Autowired、@Qualifier的区别
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Resource注解是J2EE提供,而@Autowired是由Spring提供,故减少系统对s ...
- ArcGIS API for JavaScript 4.0(一)
原文:ArcGIS API for JavaScript 4.0(一) 最近ArcGIS推出了ArcGIS API for JavaScript 4.0,支持无插件3D显示,而且比较Unity和Sky ...
- C#遍历List并删除某个或者几个元素的方法
C#遍历List并删除某个或者几个元素的方法,你的第一反应使用什么方法实现呢?foreach? for? 如果是foreach,那么恭喜你,你答错了.如果你想到的是用for,那么你只是离成功进了一步. ...
- WPF数据库连接错误:The user is not associated with a trusted SQL Server connection.
我当初安装sql server的时候选的Window Authentication mode,没选SQL Server Windows Authentication. 后来做WPF时连接数据库时需要一 ...