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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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在运行期间,可以调用线程Bjoin()方法,让线程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 




本文出自 “12931675” 博客,请务必保留此出处http://12941675.blog.51cto.com/12931675/1945760

以上是关于11.4-全栈Java笔记:线程三种状态的控制的主要内容,如果未能解决你的问题,请参考以下文章

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

11.2-全栈Java笔记:Java中如何实现多线程

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

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

11.1-全栈Java笔记:多线程技术的基本概念

11.7-全栈Java笔记:如何实现线程同步