2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解
序,线程是比进程小的进程,非常广泛的被使用。
一、继承Thread实现线程操作
1、注意setDaemon(boolean)方法,参数为true时为守护线程,参数为false时为用户线程。
守护线程的意思是生命周期由创建此线程的线程(进程)决定,创建线程死亡,则守护线程死亡。与之对应的是用户线程,用户线程的生命周期由自己决定,不受其他线程约束。
例如下面:first线程由主线程main生成,则main方法死亡时,first线程也随之消亡。
2、重写run()方法实现业务逻辑代码。run()方法不接受参数,并且无返回值。
3、启动线程需要调用Thread对象的start()方法。
package com.huawei.demo;
import java.io.IOException;
public class TryThread extends Thread {
private String firstName;
private String secondName;
private long sleepTime;
public TryThread(String firstName, String secondName, long sleepTime) {
this.firstName = firstName;
this.secondName = secondName;
this.sleepTime = sleepTime;
setDaemon(true);// 参数为true时为守护线程,参数为false时为用户线程
}
public static void main(String[] args) {
Thread first = new TryThread("Hopalong ", "Cassidy", 2000L);
Thread second = new TryThread("Marrilyn ", "Monroe", 3000L);
Thread thrid = new TryThread("Slim ", "Pickens", 5000L);
System.out.println("Press Enter when you have had enough...\n");
first.start();// 启动线程
second.start();// 启动线程
thrid.start();// 启动线程
try {
System.in.read();
System.out.println("Enter Pressed...\n");
} catch (IOException e) {
System.out.println(e);
}
}
@Override
public void run() {
while (true) {
try {
System.out.println(firstName);
sleep(sleepTime);// 休眠一定的时间
System.out.println(secondName);
} catch (InterruptedException e) {
System.out.println(firstName + secondName + e);
}
}
}
}
运行结果之一:
Press Enter when you have had enough... Hopalong
Marrilyn
Slim
Cassidy
Hopalong
Monroe
Marrilyn
Pickens
Slim
Cassidy
Hopalong
Cassidy
Hopalong
Monroe
Marrilyn
Pickens
Slim
Cassidy
Hopalong
Monroe
Marrilyn Cassidy
Hopalong
Enter Pressed...
二、停止线程
interrupt()、isInterrupted()、、、、
线程可以调用Thread对象的interrupt()方法来发送信号给另一个线程告诉它该停止运行了。这本身并不能停止线程,它只是在线程中设置一个标志,指出有一个中断请求。
要想使这个标志起作用必须在run()方法中检测它。发生这种情况时,sleep()方法检测线程是否已经被中断,如果已经被中断,就会抛出一个InterruptedException异常。
可以通过调用线程的isInterrupted()方法检测线程是否已经中断。如果被检测的interrupt()方法被调用了,isInterrupted()方法就会返回true。
注意这只能判断线程是否已经通过调用interrupt()方法设置了中断标志,而不能确定线程是否仍在运行。设置线程的中断标志却仍可以运行,并不是说调用了interrupt()方法线程就要终止。测试线程是否仍在运行可以调用isAlive()方法,如果线程没有终于,该方法返回true;
实例方法isInterrupted()对于线程的中断标志没有影响,如果中断标志设置了,调用该方法后仍然设置。但是Thread类中的静态方法isInterrupted()却不同。它测试当前运行的线程是否被中断,如果已经中断,它清除当前Thread对象的中断标志并返回true。
当抛出InterruptedException异常时,线程中记录中断的标志被清除,所以接下来的isInterrupted()或interrupted()调用会返回false。
三、连接线程
如果一个线程中需要等待另一个线程消亡,可以调用join()方法来处理希望消亡的线程。join()方法将暂停当前的线程,直到指定的线程消亡。
thread1.join();
thread1.join(1000);也可指定一个时间,等待另一个线程消亡的毫秒数。
四、实现Runnable实现线程操作
package com.huawei.demo;
import java.io.IOException;
public class JumbleNames implements Runnable {
private String firstName;
private String secondName;
private long sleepTime;
public JumbleNames(String firstName, String secondName, long sleepTime) {
super();
this.firstName = firstName;
this.secondName = secondName;
this.sleepTime = sleepTime;
}
public static void main(String[] args) {
Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L));
Thread second = new Thread(new JumbleNames("Marrilyn ", "Monroe", 800L));
Thread third = new Thread(new JumbleNames("Slim ", "Pickens", 1000L));
first.setDaemon(true);//守护线程
second.setDaemon(true);//守护线程
third.setDaemon(true);//守护线程
System.out.println("Press Enter when you have had enough...\n");
first.start();// 启动线程
second.start();// 启动线程
third.start();// 启动线程
try {
System.in.read();
System.out.println("Enter Pressed...\n");
} catch (IOException e) {
System.out.println(e);
}
System.out.println("Ending main()\n");
}
@Override
public void run() {
while (true) {
try {
System.out.println(firstName);
Thread.sleep(sleepTime);// 休眠一定的时间
System.out.println(secondName);
} catch (Exception e) {
System.out.println(firstName + secondName + e);
}
}
}
}
1、为线程设置名称
Thread first = new Thread(new JumbleNames("Hopalong ", "Cassidy", 500L),"firstThread");
默认线程名称为Thread*加上一个序列号,也可以指定线程名称。
可以通过调用Thread对象的getName()来获得指定的线程名。也可以通过Thread中定义的setName()方法来改变线程名。
五、同步处理-使用方法
六、同步处理-同步语句块
七、线程间通信
八、线程优先级
九、死锁
2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解的更多相关文章
- Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...
- Java多线程系列二——Thread类的方法
Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- 夯实Java基础系列11:深入理解Java中的回调机制
目录 模块间的调用 多线程中的"回调" Java回调机制实战 实例一 : 同步调用 实例二:由浅入深 实例三:Tom做题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 ...
- Java基础系列1:深入理解Java数据类型
Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个 ...
- Java基础系列-ArrayList
原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...
- Java基础系列-Collector和Collectors
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...
- Java基础系列-二进制操作
原创文章,转载请标注出处:<Java基础系列-二进制操作> 概述 Java源码中涉及到大量的二进制操作,非常的复杂,但非常的快速. Java二进制表示法 首先了解下二进制,二进制是相对十进 ...
- Git学习(二)(2015年11月18日)(2016年1月29日)
2015年11月18日Git学习: .Shell 删除文件夹及其所有文件 rd/s/q 文件目录 ---------------当前为先创建本地Git库后与网上Git服务器关联------------ ...
随机推荐
- codeforces 342E :Xenia and Tree
Description Xenia the programmer has a tree consisting of n nodes. We will consider the tree nodes i ...
- hdu 5237 二进制
很无聊的模拟题...mark几个有用的小程序: 字符->二进制ASCII码 string tobin(char c) { string t; ; i<; i++) { t=+)+t; c/ ...
- sstream使用简介
sstream即字符串流.sstream有三种类:ostringstream:用于输出操作,istringstream:用于输入操作,stringstream:用于输入输出操作其实我感觉只用第三个就够 ...
- Linux操作系统PS命令详细解析
要对系统中进程进行监测控制,用 ps 命令满足你. /bin/ps ps 是显示瞬间行程的状态,并不动态连续:如果想对进程运行时间监控,应该用 top 工具. kill 用于杀死进程. ======= ...
- 数组内部对象排序(sort)
1.数组排序有很多方法比如for,while循环去进行冒泡排序或者快速看.排序等多种排序方法 而我在这里要说的是苹果API提供的几个系统方法 a.迭代器 Descriptor b.方法比较 ...
- 在CentOS上安装Sublime Text
CentOS 是基于 Red Hat (RHEL) 的, 其中并没有包管理工具 apt. 最近需要在装了 CentOS 系统的服务器上安装Sublime Text, 到官网上看了一下, 对其他 (De ...
- [Android]Unit Test for Android
根据Android Developer文档,对Android的UT做个学习总结: 1. 搭建Eclipse测试环境. Eclipse的ADT(Android Developer Tools) 插件为我 ...
- Thenao tutorial – indexing
Theano和numpy一样,支持基本的下标取值方法和高级的下标取值方法. 因为theano中没有boolean类型,所以不支持boolean类型的masks. # head file support ...
- ubuntu 设置hostname
永久修改hostname: # sudo vim /etc/hostname # sudo vim /etc/hosts
- 遍历jsonobject
遍历jsonobject 1 entrySet.iterator生成迭代器 2 从迭代器获取Map.Entry的单元对象 3 获取key和value Map<String,JSONObject& ...