一、线程的状态

线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。

它们之间的关系:

二、线程操作相关方法

1.设置和取得线程名称。

如果不设置线程名称,系统会自动分配线程名,一般格式为Thread-Xx

获取当前线程用Thread.currentThread.getName();

线程名称的设置,Thread类中已经建好了各种构造器。

中间带有String的基本都是设置线程名称的,大家可以自行看下。

 public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
Thread t2 = new Thread(s, "线程t2");
Thread t3 = new Thread(s); t1.start();
t2.start();
t3.start();
}
} class TestSleep implements Runnable{
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
运行结果:
线程t1 i:0
Thread-0 i:0
线程t2 i:0
Thread-0 i:1
线程t1 i:1
Thread-0 i:2
线程t2 i:1
Thread-0 i:3
线程t1 i:2
Thread-0 i:4
线程t2 i:2
线程t1 i:3
线程t1 i:4
线程t2 i:3
线程t2 i:4

2.判断线程是否启动

判断当前线程是否“”活着“”,可能大家对于线程活着这个定义不是很清楚。说明点就是线程启动了,而且也没有死亡就称之为活着。

 public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
Thread t2 = new Thread(s, "线程t2");
System.out.println(t1.isAlive()); //false
System.out.println(t2.isAlive()); //false
t1.start();
System.out.println(t1.isAlive()); //ture
System.out.println(t2.isAlive()); //flase
t2.start(); //着这里加个延迟几秒就会发现下面会打印false。
System.out.println(t1.isAlive()); //这里的状态是不定的,假如指向到这t1和t2没有执行完,那么就是true
System.out.println(t2.isAlive()); //如果已经执行完毕进入死亡状态,这里就是false
}
} class TestSleep implements Runnable{
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
false
false
true
false
true
true
线程t1 i:0
线程t1 i:1
线程t1 i:2
线程t1 i:3
线程t1 i:4
线程t2 i:0
线程t2 i:1
线程t2 i:2
线程t2 i:3
线程t2 i:4

当现场处于就绪状态和运行状态都是true,可能又会有疑问那处于堵塞状态了。

我们接下里就测试下处于堵塞状态下isAlive();

public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
Thread t2 = new Thread(s, "线程t2");
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
t1.start();
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
t2.start();
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
}
} class TestSleep implements Runnable{
synchronized public void run(){
try {
this.wait(); //当前线程等待,即进堵塞状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
运行结果:
false
false
true
false
true
true

可以发现最后两个线程都堵塞了,但最后打印的状态还是true,处于堵塞状态的线程也是存活的。

3.线程的强制加入

 public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
for(int i = 0; i < 10; i++){
if(i == 5){
try {
t1.join(); //当i为5时,强制加入线程t1
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + i);
}
}
} class TestSleep implements Runnable{
synchronized public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
main0
main1
main2
main3
main4
线程t1 i:0
线程t1 i:1
线程t1 i:2
线程t1 i:3
线程t1 i:4
main5
main6
main7
main8
main9

强制加入的线程运行完毕后才会让出资源。

4.线程的休眠

 public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
}
} class TestSleep implements Runnable{
synchronized public void run(){
for(int i = 0; i < 5; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}

sleep(填入的数字代表毫秒),上图中填入的是1000代表休眠1s,运行后我们会发现每隔一秒打印一次线程名+ i的值。

5.线程的中断。

可以使用interrupt()方法中断线程的运行。

 public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
t1.interrupt();
}
} class TestSleep implements Runnable{
public void run(){
System.out.println("开始休眠10s");
try {
Thread.sleep(10000);
System.out.println("完成休眠");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("当前线程被中断,休眠失败");
}
20 System.out.println("run正常运行结束");
}
}

如上代码没有被中断应是线程进入run中“开始休眠10s”,10s后会打印出“休眠完成”,"正常运行结束。"

运行我们会发现一运行就出现了“开始休眠10s”,"当前线程被中断,休眠失败",说明执行t1.interrupt()后t1线程被中断了执行。

运行结果:
开始休眠10s
当前线程被中断,休眠失败

6.线程的礼让

 public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
for(int i = 0; i < 10; i++){
if(i == 5){
System.out.println("开始礼让:");
Thread.currentThread().yield();
}
System.out.println(Thread.currentThread().getName() + i);
}
}
} class TestSleep implements Runnable{
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}

用yield()可以让当前线程暂停,暂时让其他线程来运行。

是暂时让一会不是一直让,只让一会就不让了,具体调度要看CPU。

运行结果:
main0
main1
main2
main3
main4
开始礼让:
线程t1 i:0
main5
main6
main7
main8
线程t1 i:1
main9
线程t1 i:2
线程t1 i:3
线程t1 i:4

2.2多线程(java学习笔记)线程状态及线程操作的相关方法的更多相关文章

  1. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  2. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  3. Java 学习笔记之 Stop停止线程

    Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...

  4. Java 学习笔记之 Sleep停止线程

    Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...

  5. Java 学习笔记之 Return停止线程

    Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...

  6. Java 学习笔记 IO流与File操作

    可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...

  7. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  8. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  9. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  10. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

随机推荐

  1. Oracle 学习----游标(使用无参光标cursor)

    表: ----游标----------------------------- declare cursor tt is select name,sal from temp; vname temp.na ...

  2. Java 实现二叉树的构建以及3种遍历方法

    转载自http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿 ...

  3. PHP面向对象练习2

    思路:构造函数完成数据库连接,增删改一个方法,查询一条记录一个方法,查询多条一个方法,sql执行失败则返回提示,并交出sql语句方便查错 代码: <?class dbcontroll{ priv ...

  4. AJAX提交表单后要清空,否则再次提交原来的数据会认为重复提交,提交失败。使用ajaxSubmit 函数需要引入jquery.form.min.js 文件

    <script src="../../Scripts/js/jquery.form.min.js" type="text/javascript">& ...

  5. EXTJS4.0 grid 可编辑模式 配置

    首先配置这个参数 plugins:[//插件 Ext.create("Ext.grid.plugin.CellEditing",{ clicksToEdit:1//单元格 点一下就 ...

  6. HDU 5366 dp 递推

    The mook jong Accepts: 506 Submissions: 1281 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...

  7. 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统

    这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...

  8. canvas2D 基础知识 浅析

    1.canvas HTML5给出的一个可以展示绘图内容的标签 使用领域: (推荐网站:threejs.org) 1. 游戏   2. 可视化数据  3. Banner广告  4. 多媒体 (1)在 c ...

  9. linux -特殊符号

    在shell中常用的特殊符号罗列如下: # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* \"string\"* **   ...

  10. poj1039 Pipe(计算几何叉积求交点)

    F - Pipe Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Sta ...