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服务器关联------------ ...
随机推荐
- POJ2195 Going Home
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22091 Accepted: 11156 Description On ...
- clickheat简介
装了个wappalyzer,各种感兴趣的去翻各种网站都用了什么框架啊啊啊...然后在qunar.com遇到了clickheat.之前只是听过这类插件,没想到真的在用唉. ClickHeat is a ...
- C#12种顺序排序
这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数R ...
- Hierarchical Softmax
When predicting over large vocabulary, softmax becomes one of the expensive computation part. There ...
- HD1556Color the ball(树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- java编程思想-java中的并发(四)
五. 新类库中的构件 Java SE5的java.util.concurrent引入了大量设计用来解决并发问题的新类.学习使用它们将有助于编写出更加简单而强壮的并发程序. 1. CountDownLa ...
- tp中附件上传文件,表单提交
public function tianjia(){ $goods=D('Goods'); if(!empty($_POST)){ if($_FILES['f_goods_image']['error ...
- linux配置oracle11G监听及本地网络服务 及 数据库建库
配置监听及本地网络服务 在oracle用户的图形界面oracle用户中,新开启一个终端,输入命令netca 会弹出如下界面. 数据库建库 在oracle用户的图形界面oracle用户中,新开启一个终端 ...
- JavaWeb学习笔记——Tomcat配置
使用的Tomcat版本是apache-tomcat-6.0.20 详细的环境变量配置参考<windows 7系统安装与配置Tomcat服务器环境> 网址为http://jingyan.ba ...
- setTimeout 导致的浏览器假死
问题 前几天,同事遇到一个浏览器假死的问题.就是浏览器在响应一个请求的时候,就突然不响应时间,进入假死状态,Cup也飙升到100%. 但是这个问题只出现在IE浏览器,chrome和Firefox等 ...