11.4-全栈Java笔记:线程三种状态的控制

关于Java线程终止、暂停、联合的文章网上有很多,经过测试,本节重点讲解的是针对不同使用场景选择合适的方法。

终止线程的典型方式

终止线程我们一般不使用JDK提供的stop()/destroy()方法(他们本身也被JDK废弃了)。通常的做法是提供一个boolean型的终止变量,当这个变量置为false,则终止线程的运行。

【示例1】终止线程的典型方法(重要!!!)


public class TestThreadCiycle implements   Runnable {

String name;

boolean live = true;

public TestThreadCiycle(String name) {

super();

this.name = name;

}

public void run() {

int i=0;

while(live){

System.out.println(name+(i++));

}

}

public void terminate(){

live = false;

}

public static void main(String[] args) {

TestThreadCiycle ttc = new TestThreadCiycle("线程A:");

Thread t1 = new Thread(ttc);  //新生状态

t1.start();   //就绪状态

for(int i=0;i<1000;i++){

System.out.println(i);

}

ttc.terminate();

System.out.println("ttc stop!");

}

}

暂停线程执行sleep/yield

sleep()可以让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态。

yield()可以让正在运行的线程直接进入就绪状态,让出CPU的使用权。

【示例2】暂停Threads的方法sleepyield


public class TestThreadState {

public static void main(String[] args) {

//使用继承方式实现多线程

StateThread thread1 =   new StateThread();

thread1.start();

StateThread thread2 =   new StateThread();

thread2.start();

}

}

class StateThread extends Thread {

public void run(){

for(int i=0;i<100;i++){

System.out.println(this.getName()+":"+i);

try {

Thread.sleep(2000);

catch (InterruptedException e) {

e.printStackTrace();

}

//Thread.yield();

}

}

}

线程的联合join()

线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。

如下面示例中,“爸爸线程”要抽烟,于是联合了“儿子线程”去买烟,必须等待“儿子线程”买烟完毕,“爸爸线程”才能继续抽烟。

【示例3】测试线程的联合join()方法


public class TestThreadState {

public static void main(String[] args) {

System.out.println("爸爸和儿子买烟故事");

Thread father = new Thread(new   FatherThread());

father.start();

}

}

class FatherThread  implements  Runnable {

public void run() {

System.out.println("爸爸想抽烟,发现烟抽完了");

System.out.println("爸爸让儿子去买包红塔山");

Thread son = new Thread(new SonThread());

son.start();

System.out.println("爸爸等儿子买烟回来");

try {

son.join();

catch (InterruptedException e) {

e.printStackTrace();

System.out.println("爸爸出门去找儿子跑哪去了");

System.exit(1);//结束JVM。如果是0则表示正常结束;如果是非0则表示非正常结束

}

System.out.println("爸爸高兴的接过烟开始抽,并把零钱给了儿子");

}

}

class SonThread implements Runnable {

public void run() {

System.out.println("儿子出门去买烟");

System.out.println("儿子买烟需要10分钟");

try {

for (int i = 1; i <=10;i++) {

System.out.println("第" + i + "分钟");

Thread.sleep(1000);

}

catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("儿子买烟回来了");

}

}



「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。

 笔记包含从浅入深的六大部分:

A-Java入门阶段

B-数据库从入门到精通

C-手刃移动前端和Web前端

D-J2EE从了解到实战

E-Java高级框架精解

F-Linux和Hadoop

时间: 2024-10-13 19:27:09

11.4-全栈Java笔记:线程三种状态的控制的相关文章

11.9-全栈Java笔记: 线程并发协作(生产者/消费者模式)

多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型"生产者消费者模式". 什么是生产者? 生产者指的是负责生产数据的模块(这里模块可能是:方法.对象.线程.进程). 什么是消费者? 消费者指的是负责处理数据的模块(这里模块可能是:方法.对象.线程.进程). 什么是缓冲区? 消费者不能直接使用生产者的数据,它们之间有个"缓冲区".生产者将生产好的数据放入"缓冲区",消费者从"缓冲区"

11.3-全栈Java笔记:线程的生命周期

一个线程对象在它的生命周期内,需要经历5个状态. 新生状态(New) 用new关键字建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态. 就绪状态(Runnable) 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于 "线程就绪队列",等待系统为其分配CPU. 就绪状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会进入执行状态. 一旦获得CPU,线程就进入运行状态并自动调用自己的run

11.11-全栈Java笔记:线程状态转换和任务定时调度

线程状态转换 1)New :创建好线程对象,但没有启动的时候. 一个线程调用start()之后不一定会马上启动,此时进入就绪状态,等待得到资源. 2)就绪线程序通过Scheduler(调度程序)去确定是否运行. 3)Runing---dead:运行结束(非双向,为单向箭头). 4)Runing---就绪:暂停(除了没有CPU,具备运行的所有条件). 5)Runing-otherwise(阻塞):因程序原因:调用sleep或join之后,线程被阻塞.这时不具备运行的条件,此时线程进入阻塞池.sle

11.5-全栈Java笔记:线程基本信息和优先级别

获取线程基本信息的方法 表  线程的常用方法 方法 功能 isAlive() 判断线程是否还"活"着,即线程是否还未终止. getPriority() 获得线程的优先级数值 setPriority() 设置线程的优先级数值 setName() 给线程一个名字 getName() 取得线程的名字 currentThread() 取得当前正在运行的线程对象,也就是取得自己本身 [示例1]线程的常用方法举例一 public class ThreadTest3 { public static 

Hibernate 入门 04 - Hibernate中Java对象的三种状态

目录:(后续不断更新...) Hibernate 入门 01 - 框架技术 (介绍Hibernate框架的发展由来) Hibernate 入门 02 - Hibernate介绍及其环境搭建 Hibernate 入门 03 - 使用Hibernate完成持久化操作 Hibernate 入门 04 - Hibernate中Java对象的三种状态 ▁▃▅ Hibernate中Java对象的三种状态▅▃▁ 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久

Hibernate中Java对象的三种状态

首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用, 瞬态到持久态的方法有save().saveOrUpdate().get().load():持久态到瞬态的方法有delete(): 游离态到持久态的方法有update().saveOrUpdate().lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hibernate的

java笔记线程两种方式模拟电影院卖票

1 public class SellTicketDemo { 2 public static void main(String[] args) { 3 // 创建三个线程对象 4 SellTicket st1 = new SellTicket(); 5 SellTicket st2 = new SellTicket(); 6 SellTicket st3 = new SellTicket(); 7 8 // 给线程对象起名字 9 st1.setName("窗口1"); 10 st2.

java 启动线程三种方式

原文:http://blog.csdn.net/typename/article/details/7212512 1.继承Thread public class java_thread extends Thread{ public static void main(String args[]) { (new java_thread()).run(); System.out.println("main thread run "); } public synchronized  void 

11.6-全栈Java笔记:什么是线程同步

 同步问题的提出 现实生活中,我们会遇到"同一个资源,多个人都想使用". 比如:教室里,只有一台电脑,多个人都想使用.天然的解决办法就是,在电脑旁边,大家排队.前人使用完后,后人再使用. 线程同步的概念 处理多线程问题时,多个线程同时访问同一个对象,并且一个线程还想修改这个对象. 这时候,我们就需要用到"线程同步". 线程同步其实就是一种等待机制,多个线程需要同时访问同一个对象,则线程进入这个对象的等待池(wait pool)形成队列,等待前面的线程使用完毕后,下一